Wieso werden die Parameter nicht übergeben?

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...

Bild zum Beitrag

..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

Bild zum Beitrag

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


Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
 - (Code, Programmiersprache, C Sharp)  - (Code, Programmiersprache, C Sharp)

Weil der "param"-Block auskommentiert ist. Somit sind $docpath und $pdfpath aus Sicht von PowerShell einfach zwei undefinierte Variablen und somit "false".

DANIELdjldqwj 
Fragesteller
 21.03.2024, 11:16

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.

0
ohwehohach  21.03.2024, 11:20
@DANIELdjldqwj

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?

0
DANIELdjldqwj 
Fragesteller
 21.03.2024, 11:22
@DANIELdjldqwj

Wenn ich dieses Script ausführe so wie es da steht passiert genau nichts, eigentlich sollte dann im ordner test5 5 datein liegen.

0
ohwehohach  21.03.2024, 11:24
@DANIELdjldqwj

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.

0
DANIELdjldqwj 
Fragesteller
 21.03.2024, 11:26
@ohwehohach

naja, es findet alle pfade im script

also wo soll das problem sonst sein?

0
ohwehohach  21.03.2024, 11:27
@DANIELdjldqwj

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

0
ohwehohach  21.03.2024, 11:31
@ohwehohach

... und sobald die Pfade Leerzeichen beinhalten können, musst Du den Parameter nochmal quoten.

0
DANIELdjldqwj 
Fragesteller
 21.03.2024, 11:39
@ohwehohach

Kannst du bitte meine Freundschaftsanfrage annehmen, ich bin sehr überfordert gerade.

0
ohwehohach  21.03.2024, 12:39
@DANIELdjldqwj

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?

0