herbstengel
Goto Top

Powershell ruft Batch-Datei auf: Leerzeichenproblem

Hallo zusammen,

ich habe ein powershellskript, welches eine Batchdatei aufrufen soll und dieser einige Übergabeparameter (Befehlsparameter) übergeben soll.
In der Batchdatei soll dann die Anwendung MSBUILD von Microsoft Visual Studio einen Compiliervorgang mit den übergebenen Parametern vornehmen.

Das funktioniert insofern ganz gut, außer wenn man Leerzeichen in einem der Befehlsparameter drin hat. Damit kommt die Batchdatei nicht klar.
Ist der Fall, weil eine Datei in C:\Program Files (x86)\Microsoft Visual Studio\...liegt.

Konkret:

powershell-Datei:

function BuildTest
{

param( [string]$basicsetting , [string] $compilingBatchFilePath, [string ]$solution_Dir, [string ]$solution_FilePath, [string ]$msbuild_Path)

#batchfile / Befehlsparameter (batch): %1 %2 %3 %4
$p = Start-Process -FilePath "cmd.exe" -ArgumentList "/c $compilingBatchFilePath $basicsetting $solution_Dir $solution_FilePath $msbuild_Path" -PassThru

Wait-Process -id $p.ID -timeout 500
....
....


wobei

$compilingBatchFilePath "C:\_plc\PLL02\main\Sourcefiles\PLL02\build.bat

$basicsetting "Test"
$solution_Dir "C:\_steuerung\main\Sourcefiles\test\"
$solution_FilePath "C:\_steuerung\main\Sourcefiles\test\test.sln"
$msbuild_Path "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\"


Batch-Datei:

REM --------- Parameter List -------------
IF NOT "%1" == "" SET "BASICSETTING=%1"
IF NOT "%2" == "" SET "SOLUTIONDIR=%2"
IF NOT "%3" == "" SET "SOLUTIONFILEPATH=%3"
IF NOT "%4" == "" SET "MS_BUILDPATH=%4"
...
...
CALL %MS_BUILDPATH% %SOLUTIONFILEPATH% /p:Configuration="%BASICSETTING%";OutDir=.\%BASICSETTING%\bin_comp\VS\ /t:Clean;Build ....

%MS_BUILDPATH% wird als C:\Program interpretiert.

Bitte um eure Hilfe, vielen Dank!

Grüsse, Roger

Content-ID: 529317

Url: https://administrator.de/contentid/529317

Ausgedruckt am: 22.11.2024 um 03:11 Uhr

mayho33
Lösung mayho33 23.12.2019 aktualisiert um 20:46:33 Uhr
Goto Top
Hi!

Das Problem mit Leerzeichen in Strings umgehst du indem du den String in Anführungszeichen setzt:

Start-Process "mein Pfad\mit leerzeichen\notepad. Exe"  

Wenn ein Argument Leerzeichen enthält musst du das im Code in Anführungszeichen setzen. Dafür gibt es mehrere Varianten. Eine davon wäre:
$DATA=[char]34 + $path + [char]34

In deinem Beispiel willst du mehrere Variablen miteinander übergeben. Sind das einzelne Argumente oder verknüpfst du hier Pfade miteinander?

Ein Argument musst du trotzdem mit einem Parameter einleiten:

-Argument1 "irgendwas" - Argument2 "nochwas" usw.

Zum Verknüpfen von Pfaden musst du das +Zeichen verwenden...
"c:\windows" +"\" +"system32" +"\" +"notepad.exe"  

oder Dot. Net:

[system.Io.Path] ::Combine($a, $b) 


Grüße!
Herbstengel
Herbstengel 03.01.2020 aktualisiert um 20:39:01 Uhr
Goto Top
Hallo,

war jetzt ein paar Tage urlaubsbedingt offline face-smile
Habe mir den Vorschlag von mayho33 angeschaut, leider nicht zielführed.

Ich formuliere mein Anliegen nochmals, diesemal wie folgt vereinfacht:

Auf Powershell-Seite codiere ich

....
$BatchFilePath="C:\verzeichnisOhneLeerzeichen\test.bat"  
$BasicSetting="Test"  
$PathWithSpaces="C:\Verzeichnis Mit Leerzeichen\"  
......
#damit soll über den Kommandozeileninterpreter cmd.exe eine zwischenzeitliche Batchfileverarbeitung  mit 
#zwei Übergabeparamer angesossen werden (es sind zwei einzelne Argumente, es werden keine 
#Pfade miteinander verknüpft):

Start-Process -FilePath "cmd.exe" -ArgumentList "/c $BatchFilePath $BasicSetting  $PathWithSpaces" -PassThru  

In einer "DOS-Box" (Eingabeaufforderung, also cmd.exe) würde damit das Batchfile test.bat wie folgt mit den beiden Übergabeparametern auf der Kommondozeile wie folgt aufgerufen werden:

c\users\User> C:\verzeichnisOhneLeerzeichen\test.bat Test "C:\Verzeichnis mit Leerzeichen\"  

In test.bat können dann die beiden Übergabeparameter %1 (hat ja den Wert Test) und %~2 (hat ja den Wert "C:\Verzeichnis mit Leerzeichen\", (der Tildeoperator ist hier unbedingt notwendig)) weiterverarbeitet werden.

So liefert ECHO. %~2 die Ausgabe "C:\Verzeichnis Mit Leerzeichen\".

Mein Problem ist es, die händische Eingabeaufforderungs-Syntax in der DOS-BOX genauso auf Powershell zu übertragen.

Bei

Start-Process -FilePath "cmd.exe" -ArgumentList "/c $BatchFilePath $BasicSetting $PathWithSpaces" -PassThru
fehlen auf Batch-Seite beim zweiten Parameter die Anführungszeichen

Powershell lässt aber diese Syntax nicht zu:

....
$PathWithSpaces="C:\Verzeichnis Mit Leerzeichen\"  
Start-Process -FilePath "cmd.exe" -ArgumentList "/c $BatchFilePath $BasicSetting  "$PathWithSpaces"" -PassThru  

oder auch nicht diese Syntax

....
$PathWithSpaces=""C:\Verzeichnis Mit Leerzeichen\""  
Start-Process -FilePath "cmd.exe" -ArgumentList "/c $BatchFilePath $BasicSetting  $PathWithSpaces" -PassThru  

Bitte um weitere Hinweise, danke schön
Herbstengel
Herbstengel 04.01.2020 um 10:11:15 Uhr
Goto Top
ok, habe es hinbekommen face-smile

Entscheidender Hinweis in Add double quotes....

Damit:
...
$PathWithSpaces="C:\Verzeichnis Mit Leerzeichen\"  
$PathWithSpaces=[string]::Join("","""$PathWithSpaces""")  
...

damit weitere Verarbeitung möglich:

...
Start-Process -FilePath "cmd.exe" -ArgumentList "/c $BatchFilePath $BasicSetting  $PathWithSpaces" -PassThru  
...