2012-04-10 2 views
6

मैं यहाँ बाहर मेरे बाल खींच रहा हूँ, क्योंकि मैं सिर्फ यह काम करने के लिए नहीं कर पा रहे हैं, और मैं समझ नहीं इस मुद्दे को गूगल के लिए कैसे। मैं पावरहेल 2.0 चला रहा हूँ। यहाँ मेरी स्क्रिप्ट है:पावरहेल का Invoke-Command -ComputerName पैरामीटर के लिए एक चर में नहीं ले जाएगा?

$computer_names = "server1,server2" 
Write-Output "Invoke-Command -ComputerName $computer_names -ScriptBlock { 
    Get-WmiObject -Class Win32_LogicalDisk | 
    sort deviceid | 
    Format-Table -AutoSize deviceid, freespace 
}" 
Invoke-Command -ComputerName $computer_names -ScriptBlock { 
    Get-WmiObject -Class Win32_LogicalDisk | 
    sort deviceid | 
    Format-Table -AutoSize deviceid, freespace 
} 

पिछले आदेश त्रुटि देता है:

Invoke-Command : One or more computer names is not valid. If you are trying to 
pass a Uri, use the -ConnectionUri parameter or pass Uri objects instead of 
strings. 

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

उत्तर

5

आपने अपना सरणी की घोषणा की।

$computer_names = "server1", "server2"; 

$computer_names | %{ 
    Write-Output "Invoke-Command -ComputerName $_ -ScriptBlock { 

    ...snip 
+0

ऐसा हुआ, धन्यवाद! मैंने बस इसके लिए एक के लिए चलाने के लिए नहीं सोचा था। वह शॉर्टेंड है मैंने देखा नहीं है। लेकिन, मैं एक सरणी घोषित करने से परहेज कर रहा था क्योंकि मुझे नहीं लगता था कि Invoke-Command -ComputerName एक लेता है - इसके बजाय, यह एक अल्पविराम, कोई रिक्त स्थान से अलग कंप्यूटर नामों की एक सूची लेता है। क्या मै गलत हु? – erictheavg

+0

खुद का जवाब: ऐसा लगता है। मैंने बस उस कमांड पर मदद पढ़ी और कहा कि यह एक स्ट्रिंग [] की अपेक्षा करता है। मैं अकेले उदाहरणों से बाहर जा रहा था और एक बुरा धारणा बना दिया। – erictheavg

0

आप की कोशिश की है: करने के लिए-प्रत्येक की तरह तार और पाइप यह बीच में कॉमा रखो

$computer_names = "server1" , "server2" 

foreach ($computer in $computer_names) 
{ 
Write-Output "Invoke-Command -ComputerName $computer -ScriptBlock { 
    Get-WmiObject -Class Win32_LogicalDisk | 
    sort deviceid | 
    Format-Table -AutoSize deviceid, freespace 
}" 
Invoke-Command -ComputerName $computer -ScriptBlock { 
    Get-WmiObject -Class Win32_LogicalDisk | 
    sort deviceid | 
    Format-Table -AutoSize deviceid, freespace 
} 
} 
6

Jamey और user983965, सही कर रहे हैं में है कि अपने घोषणा गलत है। हालांकि foreach यहां अनिवार्य नहीं है। आप सिर्फ इस तरह अपने सरणी घोषणा ठीक है, यह काम करेगा:

$computer_names = "server1","server2" 
Invoke-Command -ComputerName $computer_names -ScriptBlock { 
    Get-WmiObject -Class Win32_LogicalDisk | 
    sort deviceid | 
    Format-Table -AutoSize deviceid, freespace 
} 
+0

सरणी को भरने के लिए एक और तरीका है इस तरह से काम करने के लिए यदि आप पहले से ही एक चर का उपयोग कर उदाहरण के लिए कंप्यूटर की वस्तुओं के साथ '$ computers' (बुलाया आबादी है' मिल-adcomputer' 'है $ computer_names = $ computers.name'। –

0

आप भी Active Directory से कंप्यूटर की एक array मिल रहे हैं - इस तरह:

$computers = Get-ADComputer -filter {whatever} 

सुनिश्चित करें कि आप का चयन करने के लिए याद बनाओ/परिणाम का विस्तार ... इस तरह:

$Computers= Get-ADComputer -filter * | Select-Object -ExpandProperty Name 

फिर ...

Invoke-Command -ComputerName $Computers -ScriptBlock {Do Stuff} 
संबंधित मुद्दे