2012-02-20 11 views
7

मैं बैच फ़ाइल से कोड की कई पंक्तियों को powerhell.exe -command पैरामीटर के रूप में पास करना चाहता हूं।बैच लॉन्च करने के लिए PowerShell को multiline कमांड पैरामीटर

उदाहरण के लिए, कोड इस तरह:

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, आप की तरह कुछ का उपयोग कर सकते है::; PowerShell करने के लिए "@F" जो पाइप के साथ शुरू नहीं सभी लाइनों

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

बयानों के बीच।

संपादित करें:

@@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 रिक्त स्थान होना चाहिए: मैं एक अलग विंडो में PowerShell शुरू करने और इस के साथ बाहर निकलने के लिए cmd अनुमति देने के लिए सक्षम था परिवर्तनीय को एक लाइन फ़ीड असाइन करना।

+0

मुझे लगता है कि आपका दूसरा उदाहरण बिल्कुल वही है जो मैं ढूंढ रहा था। बैच फ़ाइल में @ @ का महत्व क्या है? धन्यवाद। – mcu

+1

'@' सीएमडी को लाइन को गूंजने के लिए नहीं बताता है क्योंकि यह निष्पादित होता है। ';' केवल पैरामीटर डिलीमीटर है; ',' या '=' का भी उपयोग किया जा सकता है। यह सिर्फ इस मौके को कम करता है कि फाइल में कुछ और उस स्ट्रिंग से मेल खाता है जिसे फ़िल्टर किया जा रहा है। लाइन '@' और ',', '=' या ',' के संयोजन से शुरू हो सकती है। उदाहरण: ';; @', '@,', '== @ ,;, आदि – Rynant

+0

यह बहुत अच्छा काम करता है। केवल एक मामूली नुकसान है। इस तरह से पावरहेल शुरू करके, मेरे पास दो प्रक्रियाएं चल रही हैं: powerhell.exe और cmd.exe। इसके अलावा, खिड़की पर कोई शक्तिरोधी संकेत नहीं है। क्या powerhell.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 

आप एक आदेश है कि अन्यथा बस एक Base64- एन्कोड स्ट्रिंग की आपूर्ति करके -EncodedCommand के माध्यम से भागने अजीब आवश्यकता होगी उपयोग कर सकते हैं का हवाला देते हुए।

+0

का एक स्पष्टीकरण है, मुझे लगता है कि मैं गलत हूं। मेरा मतलब था: "मैं इसे PowerShell स्क्रिप्ट फ़ाइल बनाने के बिना करना चाहता हूं, केवल एक बैच फ़ाइल।" तो, मैं बैच फ़ाइल में इस सभी पावरहेल कोड को कैसे एन्कोड करूं? – mcu

+0

मुझे लगता है कि आप गलत पढ़ते हैं। उपरोक्त कोड की पहली पंक्ति देखें। बाकी कोड केवल मदद से उद्धृत किया गया है और आपको दिखाता है कि * इस तरह की एन्कोडेड कमांड स्ट्रिंग कैसे बनाएं *। – Joey

+0

ठीक है, लेकिन मैं बैच फ़ाइल में उस एन्कोडेड स्ट्रिंग के साथ कैसे आ सकता हूं? धन्यवाद। – mcu

1

आप -Command - का उपयोग कर सकते हैं जो ps को stdin से इसके आदेशों को पढ़ने का कारण बनता है। एक फ़ाइल में अपने आदेश रखो, और आह्वान

powershell -Command - <myCommandFile 
+0

यह शायद काम करेगा, लेकिन इसे अभी भी एक अतिरिक्त फ़ाइल की आवश्यकता है। मैं बैच फ़ाइल स्वयं निहित होना होगा। धन्यवाद। – mcu

+0

उस स्थिति में आप केवल '-फाइल' का उपयोग कर सकते हैं जो आसान है। – Joey

+0

@ जॉय मुझे लगता है कि सुरक्षा परिप्रेक्ष्य से कमांड चलाने के लिए एक स्क्रिप्ट (जैसे -फाइल) चलाना अलग है, लेकिन मैं गलत हो सकता हूं, मैं पीएस विशेषज्ञ नहीं हूं। – wmz

1

जॉय के रास्ते सरल है, लेकिन आप भी अपने मामले में एक साधारण बहु आदेश का उपयोग कर सकता है

खाली लाइनों यहाँ जरूरी हैं (Rynant की वामो नमूने में की तरह)

powershell -command if ($true)^ 

{^ 

Write-Host "Result is True"^ 

}^ 

else^ 

{^ 

Write-Host "Result is False"^ 

} 

यहाँ Long commands split over multiple lines

संबंधित मुद्दे