2012-02-20 4 views
7

Я хочу передать несколько строк кода из командного файла в файл powershell.exe как параметр -command.Пакетный запуск PowerShell с многострочным параметром команды

Например, следующий код:

SET LONG_COMMAND= 
if ($true) 
{ 
Write-Host "Result is True" 
} 
else 
{ 
Write-Host "Result is False" 
} 

START Powershell -noexit -command "%LONG_COMMAND%" 

Я хотел бы сделать это без создания файла сценария PowerShell, только пакетный файл.
Возможно ли это?

Спасибо.

ответ

9

Вы можете добавить «^», чтобы продолжить строку, вы назначаете переменной. Это создает команду как одну строку, поэтому вам нужно использовать ';' между утверждениями:

@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», так как мы присваивая переменную строку.

+0

Я думаю, что ваш второй пример - именно то, что я искал. Каково значение: @ в пакетном файле? Благодарю. – mcu

+1

'@' сообщает cmd не повторять строку по мере ее выполнения. ';' Является просто разделителем параметров; ',' или '=' также могут быть использованы. Это просто уменьшает вероятность того, что что-то еще в файле будет соответствовать отфильтрованной строке. Строка может начинаться с '@' и любой комбинации ';', '=' или ','. Примеры: ';; @', '@,', '== @ ,;' и т. Д. – Rynant

+0

Это отлично работает. Существует только один недостаток MINOR. Таким образом, запуская powershell, у меня есть два процесса: powershell.exe и cmd.exe. Кроме того, в окне нет подсказки powershell. Возможно ли запустить «powershell.exe» и выйти из cmd.exe? – mcu

5

Использование

start powershell -NoExit -EncodedCommand "aQBmACAAKAAkAHQAcgB1AGUAKQAKAHsACgBXAHIAaQB0AGUALQBIAG8AcwB0ACAAIgBSAGUAcwB1AGwAdAAgAGkAcwAgAFQAcgB1AGUAIgAKAH0ACgBlAGwAcwBlAAoAewAKAFcAcgBpAHQAZQAtAEgAbwBzAHQAIAAiAFIAZQBzAHUAbAB0ACAAaQBzACAARgBhAGwAcwBlACIACgB9AAoA" 

Цитируя powershell /?

# To use the -EncodedCommand parameter: 
$command = 'dir "c:\program files" ' 
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command) 
$encodedCommand = [Convert]::ToBase64String($bytes) 
powershell.exe -encodedCommand $encodedCommand 

Вы можете использовать команду, которая бы в противном случае требуется неудобно бежать через -EncodedCommand просто поставлять в кодировке Base64 строку.

+0

Я думаю, что я оговорился. Я имел в виду: «Я бы хотел сделать это, не создавая файл сценария PowerShell, а только командный файл». Итак, как мне закодировать весь этот код powershell в пакетном файле? – mcu

+0

Я думаю, что вы неправильно поняли. См. Первую строку кода выше. Остальная часть кода просто указана из справки и показывает вам, как * создать * такую ​​кодированную командную строку. – Joey

+0

ОК, но как мне придумать эту закодированную строку в пакетном файле? Благодарю. – mcu

1

Вы можете использовать -Command -, что заставляет ps читать его команды от stdin. Поместите свои команды в файл, и вызовите

powershell -Command - <myCommandFile 
+0

Возможно, это сработает, но для этого требуется дополнительный файл. Я бы командный файл был автономным. Благодарю. – mcu

+0

В этом случае вы можете просто использовать '-File', что проще. – Joey

+0

@Joey Я думаю, что запуск сценария (как с -File) отличается от запуска команд с точки зрения безопасности, но я могу ошибаться, я не эксперт PS. – wmz

1

Путь Джои является надежной, но вы также можете использовать простую команду многострочный в вашем случае

Пустые строки необходимо здесь (как в образце НЧ-Rynant)

powershell -command if ($true)^ 

{^ 

Write-Host "Result is True"^ 

}^ 

else^ 

{^ 

Write-Host "Result is False"^ 

} 

Здесь является объяснением Long commands split over multiple lines

Смежные вопросы