Możesz dodać „^”, aby kontynuować ciąg które przypisujemy do zmiennej. Tworzy to polecenie jako pojedynczą linię, więc musisz użyć ";" między stwierdzeniami:
@ECHO off
SET LONG_COMMAND=^
if ($true)^
{^
Write-Host "Result is True";^
Write-Host "Multiple statements must be separated by a semicolon."^
}^
else^
{^
Write-Host "Result is False"^
}
START Powershell -noexit -command %LONG_COMMAND%
Jeśli tylko kod trzeba wykonać jest PowerShell, można użyć coś takiego:
;@Findstr -bv ;@F "%~f0" | powershell -command - & goto:eof
if ($true){
Write-Host "Result is True" -fore green
}
else{
Write-Host "Result is False" -fore red
}
Start-Sleep 5
których rury nie wszystkie linie zaczynające się od „; @n” do PowerShell.
Edit: udało mi się uruchomić PowerShell w osobnym oknie i pozwalają cmd, aby wyjść z tego:
@@ECHO off
@@setlocal EnableDelayedExpansion
@@set LF=^
@@SET command=#
@@FOR /F "tokens=*" %%i in ('Findstr -bv @@ "%~f0"') DO SET command=!command!!LF!%%i
@@START powershell -noexit -command !command! & goto:eof
if ($true){
Write-Host "Result is True" -fore green
}
else{
Write-Host "Result is False" -fore red
}
Należy pamiętać, że musi istnieć 2 miejsca po ustawieniu zmiennej „LF” ponieważ jesteśmy przypisywanie linii do zmiennej.
Myślę, że twój drugi przykład jest dokładnie tym, czego szukałem. Jakie jest znaczenie; @ w pliku wsadowym? Dzięki. – mcu
'@ 'mówi cmd, aby nie echo linii podczas jej wykonywania. ';' Jest po prostu ogranicznikiem parametru; Można również użyć ',' lub '='. Zmniejsza to szansę, że coś innego w pliku będzie pasować do łańcucha, który jest odfiltrowywany. Linia może zaczynać się od '@ 'i dowolnej kombinacji'; ',' = 'lub', '. Przykłady: ';; @', '@,', '== @ ,;', itp. – Rynant
Działa to świetnie. Istnieje tylko jedna niedogodność MNIEJSZA. Uruchomienie powłoki powershell w ten sposób powoduje uruchomienie dwóch procesów: powershell.exe i cmd.exe. W oknie nie ma również znaku zachęty. Czy można "uruchomić" plik powershell.exe i zakończyć program cmd.exe? – mcu