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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 529317
Url: https://administrator.de/contentid/529317
Ausgedruckt am: 22.11.2024 um 03:11 Uhr
3 Kommentare
Neuester Kommentar
Hi!
Das Problem mit Leerzeichen in Strings umgehst du indem du den String in Anführungszeichen setzt:
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:
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...
oder Dot. Net:
Grüße!
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!