2012-02-20 11 views
7

ile başlatıyor Bir toplu iş dosyasından birkaç komut satırı powershell.exe olarak -command parametresine geçmek istiyorum. Böyle ÖrneğinToplu iş istasyonu PowerShell'i çok satırlı bir komut parametresi

, kod:

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

START Powershell -noexit -command "%LONG_COMMAND%" 

Bir PowerShell komut dosyası oluşturmadan bunu yapmak istiyorum, sadece bir toplu iş dosyası.
Mümkün mü?

Teşekkürler. 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 

Aksi takdirde basit bir Base64 kodlu dize sağlayarak -EncodedCommand yoluyla kaçan garip gerektirecek bir komutu kullanabilirsiniz gelen aktaran

cevap

9

Sen bir değişkene atadığınız dize devam etmek '^' ekleyebilirsiniz çağırmak. Bu, komutu tek bir satır olarak oluşturur, dolayısıyla ';' "; @F" PowerShell tüm hatlar ile başlayan olmayan hangi boruları

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

: Eğer yürütmek için gereken tek kod PowerShell, gibi bir şey kullanabilirsiniz ise

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

: ifadesi arasında.

Düzenleme: biz beri 'LF' değişkeni ayarladıktan sonra 2 boşluk olması gerektiğini

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

Not: Ben ayrı bir pencerede PowerShell başlatın ve bununla çıkmak için cmd izin başardı değişkene bir satır besleme atama.

+0

Bence ikinci örneğiniz tam olarak aradığım şey. Bir toplu iş dosyasında; @ 'ın önemi nedir? Teşekkürler. – mcu

+1

'@' cmd'ye yürütürken satırı yankılamamasını söyler. '' 'Sadece bir parametre sınırlayıcısıdır; ',' veya '=' de kullanılabilir. Dosyadaki başka bir şeyin filtrelenen dizeyle eşleşmesi olasılığını azaltır. Hat, '@' ve ';', '=' veya ',' herhangi bir kombinasyonu ile başlayabilir. Örnekler: ';; @', '@,', '== @ ,;' vb. – Rynant

+0

Bu harika çalışıyor. Sadece bir tane MINOR dezavantajı var. Powershell'i bu şekilde başlatarak, iki işlemi çalıştırıyorum: powershell.exe ve cmd.exe. Ayrıca, pencerede hiçbir powershell istemi yoktur. powershell.exe "başlatılıyor" ve cmd.exe aracından çıkmak mümkün mü? – mcu

5

Kullanım

start powershell -NoExit -EncodedCommand "aQBmACAAKAAkAHQAcgB1AGUAKQAKAHsACgBXAHIAaQB0AGUALQBIAG8AcwB0ACAAIgBSAGUAcwB1AGwAdAAgAGkAcwAgAFQAcgB1AGUAIgAKAH0ACgBlAGwAcwBlAAoAewAKAFcAcgBpAHQAZQAtAEgAbwBzAHQAIAAiAFIAZQBzAHUAbAB0ACAAaQBzACAARgBhAGwAcwBlACIACgB9AAoA" 

.

+0

'un bir açıklamasıdır. Demek istediğim: "Bir PowerShell betik dosyası oluşturmadan bunu yapmak istiyorum, sadece bir toplu iş dosyası." Peki, tüm bu powershell kodunu bir toplu iş dosyasında nasıl kodlarım? – mcu

+0

Sanırım yanlış yazıyorsunuz. Yukarıdaki kodun ilk satırına bakın. Kodun geri kalanı sadece yardımdan alıntılanır ve * kodlanmış bir komut dizesinin * nasıl oluşturulacağını gösterir. – Joey

+0

Tamam, ama kodlanmış dizeyle toplu iş dosyasında nasıl gelebilirim? Teşekkürler. – mcu

1

-Command -'u kullanarak ps'nin stdin komutlarını okumasına neden olabilirsiniz. bir dosyaya komutları koyun ve

powershell -Command - <myCommandFile 
+0

Bu muhtemelen çalışır, ancak yine de ek bir dosya gerektirir. Toplu iş dosyasının kendi kendine yeterli olmasını isterdim. Teşekkürler. – mcu

+0

Bu durumda daha kolay olan '-Dosya'yı kullanabilirsiniz. – Joey

+0

@Joey Bir betiğin (-File ile olduğu gibi) çalıştırılması, güvenlik perspektifinden komutların çalıştırılmasından farklıdır, fakat yanılıyor olabilirim, PS uzmanı değilim. – wmz

1

Joey yolu hatasız değildir, ama aynı zamanda

boş satırlar İşte

powershell -command if ($true)^ 

{^ 

Write-Host "Result is True"^ 

}^ 

else^ 

{^ 

Write-Host "Result is False"^ 

} 

(Rynant ait LF örneğinde benzeri) burada gerekli olan sizin durumunuzda basit satırlı komutunu kullanabilirsiniz Long commands split over multiple lines

İlgili konular