PowerShell में कमांड-लाइन तर्कों को कैसे संभालें


494

कमांड-लाइन तर्कों को संभालने का "सबसे अच्छा" तरीका क्या है?

ऐसा लगता है कि "सबसे अच्छा" तरीका क्या है पर कई जवाब हैं और इसके परिणामस्वरूप मैं इस बात पर अड़ा हुआ हूं कि किसी चीज को कैसे सरल तरीके से संभालना है:

script.ps1 /n name /d domain

तथा

script.ps1 /d domain /n name.

क्या कोई प्लगइन है जो इसे बेहतर तरीके से संभाल सकता है? मुझे पता है कि मैं यहां पहिया को फिर से मजबूत कर रहा हूं।

जाहिर है कि मैं पहले से ही सुंदर नहीं हूं और निश्चित रूप से "सर्वश्रेष्ठ" नहीं हूं, लेकिन यह काम करता है .. और यह केवल है।

for ( $i = 0; $i -lt $args.count; $i++ ) {
    if ($args[ $i ] -eq "/n"){ $strName=$args[ $i+1 ]}
    if ($args[ $i ] -eq "-n"){ $strName=$args[ $i+1 ]}
    if ($args[ $i ] -eq "/d"){ $strDomain=$args[ $i+1 ]}
    if ($args[ $i ] -eq "-d"){ $strDomain=$args[ $i+1 ]}
}
Write-Host $strName
Write-Host $strDomain

जवाबों:


917

आप पहिया को फिर से मजबूत कर रहे हैं। सामान्य पॉवरशेल स्क्रिप्ट में पैरामीटर शुरू होते हैं -, जैसेscript.ps1 -server http://devserver

फिर आप उन्हें paramफ़ाइल की शुरुआत में अनुभाग में संभालते हैं ।

आप अपने पैरामेट्स को डिफ़ॉल्ट मान भी दे सकते हैं, उपलब्ध नहीं होने या स्क्रिप्ट निष्पादन बंद करने पर उन्हें कंसोल से पढ़ें:

 param (
    [string]$server = "http://defaultserver",
    [Parameter(Mandatory=$true)][string]$username,
    [string]$password = $( Read-Host "Input password, please" )
 )

स्क्रिप्ट के अंदर आप बस कर सकते हैं

write-output $server

चूंकि सभी पैरामीटर स्क्रिप्ट के दायरे में उपलब्ध चर बन जाते हैं।

इस उदाहरण में, $serverडिफ़ॉल्ट मान मिलता है यदि स्क्रिप्ट को इसके बिना कहा जाता है, तो स्क्रिप्ट बंद हो जाती है यदि आप -usernameपैरामीटर को छोड़ देते हैं और टर्मिनल इनपुट के लिए पूछते हैं कि -passwordक्या छोड़ा गया है।

अद्यतन: आप पॉवरशेल स्क्रिप्ट में "ध्वज" (बूलियन सही / गलत पैरामीटर) पास करना चाहते हैं। उदाहरण के लिए, आपकी स्क्रिप्ट एक "बल" को स्वीकार कर सकती है जहां बल का उपयोग नहीं होने पर स्क्रिप्ट अधिक सावधान मोड में चलती है।

उस कीवर्ड का [switch]पैरामीटर प्रकार है:

 param (
    [string]$server = "http://defaultserver",
    [string]$password = $( Read-Host "Input password, please" ),
    [switch]$force = $false
 )

स्क्रिप्ट के अंदर तो आप इसके साथ इस तरह काम करेंगे:

if ($force) {
  //deletes a file or does something "bad"
}

अब स्क्रिप्ट को कॉल करते समय आप स्विच / फ्लैग पैरामीटर को इस तरह सेट करेंगे:

.\yourscript.ps1 -server "http://otherserver" -force

यदि आप स्पष्ट रूप से बताना चाहते हैं कि ध्वज सेट नहीं है, तो उसके लिए एक विशेष वाक्यविन्यास है

.\yourscript.ps1 -server "http://otherserver" -force:$false

प्रासंगिक Microsoft दस्तावेज़ीकरण के लिंक (PowerShell 5.0 के लिए; थो 3.0 संस्करण और 4.0 लिंक पर भी उपलब्ध हैं):


58
वास्तव में पॉवरशेल का एक बड़ा फायदा यह है कि यह एक मानक पैरामीटर प्रदान करता है जो इन्फ्रास्ट्रक्चर को उपयोग करने में आसान है।
कीथ हिल

14
PowerShell 2.0 से @naivists [string]$username = $(throw "-username is required.")अनिवार्य मापदंडों के लिए वाक्यविन्यास है [Parameter(Mandatory=$true)][string]$username:। इन तकनीकों के बीच अंतर के बारे में अधिक जानकारी यहां दी गई है: blogs.technet.com/b/heyscriptingguy/archive/2011/05/22/…
v.karbovnichy

7
जब बग की आपूर्ति नहीं होती है, तो बग से सावधान रहें; शक्तियां केवल कमांड लाइन से किसी भी अतिरिक्त पाठ को पकड़ेंगी: \ yourcript.ps1 -server " serv " -password "mypass" टाइपो यह जादुई रूप से $ उपयोगकर्ता नाम 'टाइपो' प्रदान करेगा।
शिमस

4
एक पैरा ब्लॉक का उपयोग करने के अन्य अनपेक्षित परिणाम होते हैं, हालांकि: stackoverflow.com/questions/40940819/…
लोगान

1
@ आयुष: यह बग नहीं है! जब तक आपके पैरामीटर ब्लॉक सूचियों: $ उपयोगकर्ता $ पास सर्वर, और आप yourcript.ps1 abc निष्पादित करते हैं, तब तक Powershell उस क्रम में तर्कों को संसाधित और असाइन करेगा, जो उन्हें दिए गए हैं। $ उपयोगकर्ता में सेट, $ पास और $ सर्वर में ग, UNLESS आप विशेष रूप से उन्हें असाइन करें! इसलिए, यदि आप कहते हैं: yourscript.ps1 -pass abc, $ पास में सेट किया जाएगा, और शेष (अनाम) मापदंडों का उपयोग लापता लोगों को भरने के लिए किया जाएगा, पैरामीटर ब्लॉक में सूचीबद्ध क्रम में, इसलिए $ उपयोगकर्ता = बी, $ सर्वर = सी।
फर्नांडो मद्रयुग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.