2012-04-10 19 views
6

Tôi đang kéo tóc ra khỏi đây, vì tôi dường như không thể làm được điều này, và tôi không thể tìm ra cách để google vấn đề này. Tôi đang chạy Powershell 2.0. Đây là kịch bản của tôi:Lệnh gọi của Powershell sẽ không đưa vào biến cho tham số -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 
} 

Lệnh cuối cùng cung cấp cho các lỗi:

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. 

Nhưng khi tôi sao chép đầu ra của lệnh Write-Output để vỏ và chạy đó, nó hoạt động tốt. Làm thế nào tôi có thể bỏ biến chuỗi vào thứ mà Invoke-Command sẽ chấp nhận? Cảm ơn trước!

Trả lời

5

Bạn đã khai báo mảng của mình không chính xác. Đặt một dấu phẩy giữa dây và ống nó để for-each như:

$computer_names = "server1", "server2"; 

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

    ...snip 
+0

Điều đó đã làm điều đó, cảm ơn! Tôi không nghĩ chỉ cần chạy một cái cho nó. Đó là viết tắt tôi đã không nhìn thấy. Tuy nhiên, tôi đã tránh tuyên bố một mảng vì tôi không nghĩ rằng Invoke-Command -ComputerName mất một - thay vào đó, phải mất một danh sách các tên máy tính được phân cách bởi một dấu phẩy, không có dấu cách. Liệu tôi có sai? – erictheavg

+0

Trả lời cho chính tôi: có vẻ như vậy. Tôi chỉ đọc trợ giúp về lệnh đó và nó nói nó mong đợi một chuỗi []. Tôi đã đi ra khỏi các ví dụ một mình và thực hiện một giả định xấu. – erictheavg

0

bạn đã thử:

$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 và user983965 là chính xác, trong đó tuyên bố của bạn là sai. Tuy nhiên foreach ở đây không bắt buộc. Nếu bạn chỉ sửa chữa khai mảng của bạn như thế này, nó sẽ làm việc:

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

Một cách khác để điền mảng để làm việc theo cách này nếu bạn đã tạo một biến gọi là '$ computers' với các đối tượng máy tính (ví dụ sử dụng' get-adcomputer' là '$ computer_names = $ computers.name'. –

0

Nếu bạn nhận được một array máy tính từ Active Directory quá - như thế này:

$computers = Get-ADComputer -filter {whatever} 

Hãy chắc chắn rằng bạn nhớ chọn/mở rộng các kết quả ... như thế này:

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

Sau đó ...

Invoke-Command -ComputerName $Computers -ScriptBlock {Do Stuff} 
Các vấn đề liên quan