Wieso werden die Parameter nicht übergeben?
Also ich habe einmal ein PowerShell-Skript:
#param
#(
# [string]$docpath,
# [string]$pdfpath
#)
$docpath = "H:\Handbücher\Allgemein\Auswertung und Berichte"
$pdfpath = "H:\Test5"
# Überprüfen, ob die erforderlichen Parameter angegeben wurden
if (-not $docpath -or -not $pdfpath) {
Write-Host "Bitte geben Sie die Parameter -docpath und -pdfpath an."
exit 1
}
# Aufruf des C#-Programms und Übergabe der Parameter
$programPath = "C:\Users\SchneidewindD\source\repos\ConvertToOnlinehilfe\ConvertToOnlinehilfe\bin\Debug\app.publish\ConvertToOnlinehilfe.exe"
$args = @($docpath, $pdfpath)
Start-Process -FilePath $programPath -ArgumentList $args -Wait
Und dann noch einen Codeausschnitt:
static void Main(string[] args)
{
if (args.Length >= 2)
{
//Das erste Argument ist der Quellordner und das zweite Argument ist der Zielordner
string sourceFolder = args[0];
string targetFolder = args[1];
//Hier kannst du deine Convert - Funktion mit den übergebenen Pfaden aufrufen
ManualConvert converter = new ManualConvert();
converter.ConvertFolder(sourceFolder, targetFolder);
}
Console.ReadLine();
}
Problem ist nur, dass der Codeausschnitt die Parameter nicht bekommt. Aber warum?
2 Antworten
was soll der C#-Code bewirken?
Problem ist nur, dass der Codeausschnitt die Parameter nicht bekommt
...doch bekommt er...
...nur Deine Pfade werden via Start-Process nicht an die exe übergeben, wie Du er erwartest.
Schauen wir uns mal die Sache an :
erstmal ein kleines C#-Programm compilieren, welches uns anzeigt, was übergeben wurde.
$ShowArgs_code = @'
using System;
class test {
static void Main(string[] args)
{
Console.WriteLine("Hallo ich bin Dein Programm: \"{0}\"",System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
if(args.Length > 0)
{
Console.WriteLine("Uebergebene Argumente:");
foreach(string sArg in args)
{
Console.WriteLine(sArg);
}
}
else
{
Console.WriteLine("Keine Argumente uebergeben.");
}
Console.WriteLine("weiter mit beliebiger Taste...");
Console.ReadKey();
} }
'@
$DemoFolder = "$env:USERPROFILE\source\repos\blubb\blah"
md $Demofolder -Force
#"Dirtycompile" funktioniert so nur bis Powershell 5.1
add-type -TypeDefinition $ShowArgs_code -OutputType ConsoleApplication -OutputAssembly "$DemoFolder/ShowArgs.exe"
Start-Process $demofolder #mal zeigen wo die Exe ist
...man benötigt kein VisualStudio um ein kleines C#-Programm zu compilieren🙄.
Lass uns mal unser kleines Programm mit Deinen Pfaden aufrufen:
$docpath = "H:\Handbücher\Allgemein\Auswertung und Berichte"
$pdfpath = "H:\Test5"
$programPath = "$env:USERPROFILE\source\repos\blubb\blah\ShowArgs.exe"
$args = @($docpath, $pdfpath)
Start-Process -FilePath $programPath -ArgumentList $args -Wait
ich weiß was kommt...
..logisch, Leerzeiechen sind bei Programmaufrufen Delimiter, außer sie werden in "Quotes" gebunden.
Jetzt meinst Du, Du hättest deinen Pfad ja in "Quotes" definiert? aber die gehören zur Stringdefinition und nicht zum String
$docpath = "H:\Handbücher\Allgemein\Auswertung und Berichte"
$docpath #anzeigen wie der String intern aussieht
Ausgabe: H:\Handbücher\Allgemein\Auswertung und Berichte (Der Pfad wird an den Leerzeichen getrennt)!
willst Du "Quotes" mit einem String übergeben musst Du diese escapen:
"""H:\Handbücher\Allgemein\Auswertung und Berichte""" #escapeing durch verdoppeln
"`"H:\Handbücher\Allgemein\Auswertung und Berichte`"" #escapeing durch Backtick
Ich empfehle Quotes zu verdoppeln . Backticks` werden gern mal im Code übersehen, oder gehen bei Änderungen des Textencoding verloren!
Jetzt klappt es auch mit Pfaden, welche Leer- und Sonderzeichen enthalten:
$docpath = "H:\Handbücher\Allgemein\Auswertung und Berichte"
$pdfpath = "H:\Test5"
$programPath = "$env:USERPROFILE\source\repos\blubb\blah\ShowArgs.exe"
$args = @("""$docpath""", """$pdfpath""")
Start-Process -FilePath $programPath -ArgumentList $args -Wait
Das Problem ist weder Dein Powershell noch C#, sondern Die Art, wie das Betriebssystem Kommandozeilen auswertet.
prog.exe blah blub muh ...sind 3 Parameter
blah
blub
Muh
prog.exe "blah blub muh" ...1 Parameter
bla blub muh
Kleiner Tip zur Überprüfung der Parameter.
das Zauberwort heist Mandatory=$True . Damit übernimmt die Runtime die Überprüfungen...
function foo {
param (
[Parameter(Mandatory=$true)][string]$docpath,
[Parameter(Mandatory=$true)][string]$pdfpath
)
#viele Wege führen nach Rom
"""$docpath"""
'"{0}"'-f $pdfpath
}
foo "H:\Handbücher\Allgemein\Auswertung und Berichte" "H:\Test5"
#mal unvolständig
foo one


Habe mich dran gewöhnt...😅
Ich geh mal davon aus, das viele Fragesteller die Programmiersprachen und deren Regeln nicht wirklich beherrschen und lediglich irgendwelche simple Beispiele, die sie im Netz gefunden haben , nach ihrem Verständnis anpassen (was wie man sehen kann, gelegendlich schief geht.
Da nutzt es wenig, wenn man sich bei der Antwort Mühe gibt. Dergleichen Fragesteller , wollen sich nicht mit den Hintergründen, dem "Warum" beschäftigen . Die erwarten einfach einen möglichst direkt einsetzbaren Code. ...oder sie sind von einer Erklärungen wie den meinen schlichtweg überfordert...
Logisch, wenn ich jemandem, etwas in die Hand drücke, was dieser für Sch💩 hält, gibt's keinen Grund zum Dank...🙄
Weil der "param"-Block auskommentiert ist. Somit sind $docpath und $pdfpath aus Sicht von PowerShell einfach zwei undefinierte Variablen und somit "false".
Nein, das ist für was anderes, Aber ich habe den Pfad ja extra deklariert also docpath und pdf path also müsste das doch funktionieren.
Dann musst Du genauer schreiben, was das Problem ist. Wird die Meldung ausgegeben, dass eine der Angaben fehlt oder werden sie einfach nicht bei Start-Process weitergegeben?
Wenn ich dieses Script ausführe so wie es da steht passiert genau nichts, eigentlich sollte dann im ordner test5 5 datein liegen.
Naja, dann bau doch mal Meldungen ein und schaue, wo es hängt. Offenbar bricht dann das PowerShell Script ja nicht irgendwo ab. Also: C#-Programm mit Ausgaben versehen und schauen, was rüberkommt.
Bei der Parameterübergabe beim Shell-Aufruf beispielsweise. Oder halt sonstwo. Deine Aufgabe ist jetzt, durch debuggen (oder geeignete Programmausgaben) herauszufinden, wo genau das Problem liegt.
Geht ja schon damit los, dass "ArgumentList" aus meiner Sicht ein String sein muss, kein Array. Siehe https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-7.4
Somit könnte es heißen
Start-Process -FilePath $programPath -ArgumentList $docpath,$pdfpath -Wait
... und sobald die Pfade Leerzeichen beinhalten können, musst Du den Parameter nochmal quoten.
Kannst du bitte meine Freundschaftsanfrage annehmen, ich bin sehr überfordert gerade.
Bin kein Freund von Freundschaftsanfragen - private Diskussionen helfen meiner Meinung nach der Allgemeinheit nicht weiter. Wir können das aber gerne hier weiter ausführen. Womit hast Du denn ein Problem?
Dass diese ausführliche Antwort nicht einmal ein "Danke" vom Fragesteller bekommen hat.. xD