2012-02-20 12 views
7

Chcę przekazać kilka linii kodu z pliku wsadowego do powershell.exe jako parametr -sprawdź.Uruchomienie wsadowe PowerShell za pomocą parametru komendy wieloliniowej

Na przykład, kod tak:

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

START Powershell -noexit -command "%LONG_COMMAND%" 

Chciałbym to zrobić bez tworzenia pliku skryptu PowerShell, tylko plik wsadowy.
Czy to możliwe?

Dzięki.

Odpowiedz

9

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.

+0

Myślę, że twój drugi przykład jest dokładnie tym, czego szukałem. Jakie jest znaczenie; @ w pliku wsadowym? Dzięki. – mcu

+1

'@ '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

+0

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

5

Zastosowanie

start powershell -NoExit -EncodedCommand "aQBmACAAKAAkAHQAcgB1AGUAKQAKAHsACgBXAHIAaQB0AGUALQBIAG8AcwB0ACAAIgBSAGUAcwB1AGwAdAAgAGkAcwAgAFQAcgB1AGUAIgAKAH0ACgBlAGwAcwBlAAoAewAKAFcAcgBpAHQAZQAtAEgAbwBzAHQAIAAiAFIAZQBzAHUAbAB0ACAAaQBzACAARgBhAGwAcwBlACIACgB9AAoA" 

Cytując 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 

można użyć polecenia, które w przeciwnym razie musiałby niewygodne ucieczce poprzez -EncodedCommand po prostu dostarczanie Base64 zakodowany ciąg.

+0

Myślę, że pomyłkę. Miałem na myśli: "Chciałbym to zrobić bez tworzenia pliku skryptu PowerShell, tylko plik wsadowy." W jaki sposób mogę zakodować cały ten kod powłoki w pliku wsadowym? – mcu

+0

Myślę, że źle odczytałeś. Zobacz pierwszy wiersz kodu powyżej. Reszta kodu jest po prostu cytowana z pomocy i pokazuje, jak * utworzyć * taki zakodowany ciąg poleceń. – Joey

+0

OK, ale jak wymyślić ten zakodowany ciąg w pliku wsadowym? Dzięki. – mcu

1

Można użyć -Command -, co powoduje, że ps odczytuje komendy ze standardowego wejścia. Połóż poleceń w pliku, i powołać

powershell -Command - <myCommandFile 
+0

Prawdopodobnie zadziała, ale nadal wymaga dodatkowego pliku. Chciałbym, aby plik wsadowy był samowystarczalny. Dzięki. – mcu

+0

W takim przypadku możesz po prostu użyć '-File', co jest łatwiejsze. – Joey

+0

@Joey Wydaje mi się, że uruchamianie skryptu (podobnie jak w opcji -File) różni się od uruchamiania poleceń z perspektywy bezpieczeństwa, ale mogę się mylić, nie jestem ekspertem PS. – wmz

1

Sposób Joey jest niezawodny, ale można też użyć prostego polecenia wielowierszowego w przypadku

Puste linie są potrzebne tutaj (jak w próbce LF Rynant)

powershell -command if ($true)^ 

{^ 

Write-Host "Result is True"^ 

}^ 

else^ 

{^ 

Write-Host "Result is False"^ 

} 

Tutaj jest wyjaśnienie Long commands split over multiple lines

Powiązane problemy