Вы можете добавить «^», чтобы продолжить строку, вы назначаете переменной. Это создает команду как одну строку, поэтому вам нужно использовать ';' между утверждениями:
@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%
Если только код, который нужно выполнить это PowerShell, вы можете использовать что-то вроде:
;@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
который трубы все линии не начинающиеся с «; @F» в PowerShell.
Edit: я смог начать PowerShell в отдельном окне и позволяют CMD, чтобы выйти с этим:
@@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
}
Обратите внимание, что там должно быть 2 пробела после установки переменной «LF», так как мы присваивая переменную строку.
Я думаю, что ваш второй пример - именно то, что я искал. Каково значение: @ в пакетном файле? Благодарю. – mcu
'@' сообщает cmd не повторять строку по мере ее выполнения. ';' Является просто разделителем параметров; ',' или '=' также могут быть использованы. Это просто уменьшает вероятность того, что что-то еще в файле будет соответствовать отфильтрованной строке. Строка может начинаться с '@' и любой комбинации ';', '=' или ','. Примеры: ';; @', '@,', '== @ ,;' и т. Д. – Rynant
Это отлично работает. Существует только один недостаток MINOR. Таким образом, запуская powershell, у меня есть два процесса: powershell.exe и cmd.exe. Кроме того, в окне нет подсказки powershell. Возможно ли запустить «powershell.exe» и выйти из cmd.exe? – mcu