किसी एकल PowerShell स्क्रिप्ट पैरामीटर में कई मान पास करना


96

मेरे पास एक स्क्रिप्ट है जिसमें मैं $ args में सर्वर नाम (s) पास करता हूं।

इस तरह से मैं इस (इन) सर्वर (ओं) का उपयोग करके सामान कर सकता हूं foreach:

.\script.ps1 host1 host2 host3

foreach ($i in $args)
{
    Do-Stuff $i
}

मैं नामांकित वैकल्पिक पैरामीटर को जोड़ना चाहता हूं जिसे vlan कहा जाता है। मैंने कोशिश की:

Param(
    [string]$vlan
)

foreach ($i in $args)
{
    Write-Host $i
}
Write-Host $vlan

यदि आप एक -vlanपैरामीटर पास करते हैं तो यह काम करता है लेकिन यदि आप नहीं करते हैं तो स्क्रिप्ट ऑटो अंतिम सर्वर नाम को असाइन करता है $vlan

तो, आप एकल या एकाधिक मापदंडों को कैसे पारित कर सकते हैं और एक वैकल्पिक नाम पैरामीटर को PowerShell स्क्रिप्ट में पास कर सकते हैं?

आदर्श रूप में, यहां मान्य उदाहरण हैं:

.\script.ps1 host1
.\script.ps1 host1 host2 host3
.\script.ps1 host1 host2 -vlan office

जवाबों:


177

सबसे आसान तरीका संभवतः दो मापदंडों का उपयोग करना है: एक मेजबान के लिए (एक सरणी हो सकता है), और एक वीलन के लिए।

param([String[]] $Hosts, [String] $VLAN)

के बजाय

foreach ($i in $args)

आप उपयोग कर सकते हैं

foreach ($hostName in $Hosts)

यदि केवल एक होस्ट है, तो फ़ॉरच लूप केवल एक बार पुन: प्रसारित होगा। स्क्रिप्ट में कई मेजबानों को पास करने के लिए, इसे एक सरणी के रूप में पास करें:

myScript.ps1 -Hosts host1,host2,host3 -VLAN 2

... या ऐसा ही कुछ।


7
स्क्रिप्ट को कॉल करने के तरीके के बारे में जानकारी शामिल करने के लिए धन्यवाद - मैं अक्सर पॉवरशेल में छोटे टुकड़ों को याद कर रहा हूं।
जान बुहलर

23

पैरामीटर तर्कों से पहले इनपुट लेते हैं। इसके बजाय आपको क्या करना चाहिए एक पैरामीटर को जोड़ना है जो किसी सरणी को स्वीकार करता है, और इसे पहला स्थान पैरामीटर बनाता है। उदाहरण के लिए:

param(
    [Parameter(Position = 0)]
    [string[]]$Hosts,
    [string]$VLAN
    )

foreach ($i in $Hosts)  
{ 
    Do-Stuff $i
}

फिर इसे कॉल करें जैसे:

.\script.ps1 host1, host2, host3 -VLAN 2

मूल्यों के बीच अल्पविराम पर ध्यान दें। यह उन्हें एक सरणी में एकत्रित करता है


19

इसे करने का एक तरीका इस तरह होगा:

 param(
       [Parameter(Position=0)][String]$Vlan,
       [Parameter(ValueFromRemainingArguments=$true)][String[]]$Hosts
    ) ...

यह कई मेजबानों को रिक्त स्थान के साथ प्रवेश करने की अनुमति देगा।


बहुत अच्छे! अपने उदाहरण को छोड़कर दूसरे पैरामीटर विशेषता को बंद करने के लिए ']' याद आ रही है।
सेबेस्टियन एम

यह सबसे अच्छा जवाब होना चाहिए।
मित्राल्विक овванов

-5

मैं एक अनुसूचित स्क्रिप्ट को कॉल करता हूं जिसे इस तरह से सर्वर की सूची से जुड़ना चाहिए:

Powershell.exe -File "YourScriptPath" "Par1,Par2,Par3"

फिर स्क्रिप्ट के अंदर:

param($list_of_servers)
...
Connect-Viserver $list_of_servers.split(",")

विभाजित ऑपरेटर स्ट्रिंग की एक सरणी देता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.