PowerShell स्क्रिप्ट, जिसमें कमांड चलती हैं


37

मैं पॉवरशेल स्क्रिप्ट के साथ खेल रहा हूं और वे शानदार काम कर रहे हैं। हालाँकि, मैं सोच रहा हूं कि क्या सभी कमांड को चलाने का कोई तरीका है, जैसे कि आप मैन्युअल रूप से उन्हें स्वयं टाइप कर रहे थे। यह बैच फ़ाइलों में "इको ऑन" के समान होगा। मैंने PowerShell कमांड-लाइन तर्कों, cmdlets को देखा, लेकिन मुझे कुछ भी स्पष्ट नहीं मिला। धन्यवाद!

जवाबों:


45

निम्न कमांड स्क्रिप्ट की प्रत्येक पंक्ति को राइट-डिबग में आउटपुट करेगा-

Set-PSDebug -Trace 1

से man Set-PSDebug

जब ट्रेस पैरामीटर को 1 पर सेट किया जाता है, तो स्क्रिप्ट की प्रत्येक पंक्ति का पता लगाया जाता है क्योंकि इसे निष्पादित किया जाता है। जब पैरामीटर 2 पर सेट होता है, तो चर असाइनमेंट, फ़ंक्शन कॉल और स्क्रिप्ट कॉल का भी पता लगाया जाता है। यदि चरण पैरामीटर निर्दिष्ट है, तो स्क्रिप्ट की प्रत्येक पंक्ति निष्पादित होने से पहले आपको संकेत दिया जाता है।


यदि आप इसका उपयोग Paramकरने वाली स्क्रिप्ट में जोड़ते हैं , तो इस लाइन को परम-डिफाइनिंग ब्लॉक के नीचे रखना सुनिश्चित करें या यह विफलताओं का कारण बन सकता है।
kayleeFrye_onDeck

4

जहां मैंने echo onसीएमडी में उपयोग किया , मैं अब उपयोग करता हूं Write-Verboseऔर Set-PSDebug -Stepइसके बजाय। वे समान नहीं हैं, लेकिन यदि वे कुशलता से काम करते हैं तो वे अधिक शक्तिशाली हैं।


2

बदसूरत:

PS > get-content foo.ps1|foreach-object{$_;invoke-expression "$_"}
$procs=get-process powershell
foreach($proc in $procs){$proc.processname}
powershell
PS > get-content foo.ps1
$procs=get-process powershell
foreach($proc in $procs){$proc.processname}
PS >

उपरोक्त समस्या यह है कि यदि आपके पास इस तरह मल्टी-लाइन कमांड हैं:

foreach($proc in $procs){
  $proc.processname
}

ऊपर मेरे उदाहरण के साथ विफल हो जाएगा अगर उस संरचना के साथ foo.ps1 में रखा गया है ...


हाँ, मैं ऐसे ही आधे-अधूरे उपाय खोजता रहता हूँ। मुझे वास्तव में लगता है कि मुझे जो चाहिए, उसके लिए "सिल्वर बुलेट" नहीं है। इन समाधानों के साथ रचनात्मक होने के लिए धन्यवाद। मेरे पास अभी कुछ विकल्प हैं और यह तय करना होगा कि यहाँ से कहाँ जाना है।
नेल्सन रॉदरमेल

2
help about_History 

आपको सभी कमांड के बारे में बताएगा और

Get-History [options]  

आपके लिए पूरी सूची वापस करेगा \ _ आदि प्रदर्शन में हेरफेर करने के लिए।


2
मुझे "सेट-psdebug -trace 1" मिला जो कमांड दिखाएगा, लेकिन बहुत अधिक "शोर" मुझे नहीं चाहिए। get-history किसी स्क्रिप्ट में कुछ भी आउटपुट नहीं करता है। अगर ऐसा होता है तो मैं इसे स्क्रिप्ट के अंत में चिपका सकता हूं, लेकिन तब कमांड इन-लाइन (कमांड आउटपुट से पहले) नहीं होगा और कोई भी अपवाद इसे छोड़ देगा (जब तक कि मैं इसे नहीं पकड़ता)। यह अभी भी ध्यान में रखने के लिए एक अच्छा है ... कोई अन्य विचार?
नेल्सन रॉदरमेल

आह - क्या आपका मतलब है कि आप इनपुट और आउटपुट को कैप्चर करना चाहते हैं, या कम से कम आप इसी आउटपुट के तुरंत बाद इनपुट कमांड को इको करना चाहते हैं? ऐसा करने का एक तरीका यह है कि परिणामों को एक सरणी में धकेल दिया जाए और फिर प्राप्त होने वाले इतिहास परिणामों के माध्यम से लूप को उसके आउटपुट के बाद कमांड आउटपुट दिया जाए।
हेलविक

स्टार्ट-ट्रांसक्रिप्ट वह भी कर सकता है जो आप देख रहे हैं लेकिन यह केवल कार्रवाई के कंसोल टेक्स्ट भाग तक सीमित होने जा रहा है।
हेल्विक

आपको यह मिल गया है - उसी तरह एक बैच फ़ाइल काम करती है। अब हमारे पास बैच फ़ाइलों का एक समूह है और मैं PowerShell स्क्रिप्ट के साथ बदलने की व्यवहार्यता देख रहा हूं। हमारे पास शेड्यूलिंग के लिए सॉफ्टवेयर है, आउटपुट इतिहास को बनाए रखने के लिए, आदि के बिना इनपुट कमांड को गूंजने के लिए, यह डिबग करना कठिन है। मैं अनुमान लगा रहा हूं कि परिणामों को आगे बढ़ाने के लिए आपको हर आदेश पर यह सुनिश्चित करना होगा कि आप अपवादों को पकड़ें, आदि। एक और विकल्प, लेकिन काफी नहीं जो मैं देख रहा हूं। हमें बस एक विकल्प चुनना होगा और उसके साथ चलना होगा।
नेल्सन रॉदरमेल

मैंने स्टार्ट-ट्रांसक्रिप्ट की कोशिश की, लेकिन यह केवल लॉग इन किया कि यह शुरू / बंद हो गया, लेकिन बीच में कुछ भी नहीं। मैंने कहीं पढ़ा है कि यह इंटरएक्टिव कमांड के लिए है।
नेल्सन रॉदरमेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.