2015-07-20 44 views
0

我在PowerShell中編寫了一個超級簡單的腳本。該腳本的目標是從txt文件讀取服務器名稱列表,並從另一個txt文件讀取命令塊。操作的結果是包含信息的第三個txt文件。從文件中檢索參數 - Windows PowerShell

這裏是一些代碼:

cls 
$usr = Read-Host "Please insert username, you'll be asked for password later" 
$path = Read-Host "Insert a valid path for ServerList.txt file" 
$serverList = Get-Content -Path $path | Out-String 

$path = Read-Host "Insert a valid path fom Command.txt file" 
$commandBlock = Get-Content -Path $path | Out-String 


echo "Command: " $commandBlock "will be executed on " $serverList 
echo "Press CTRL+Z to abort or" 
pause 

Invoke-Command -ComputerName $serverList -ScriptBlock { $commandBlock } -credential $usr 

Serverlist.txt是包含類似 「服務器1,服務器,服務器3」 和command.txt只含有這種 「GET-WmiObject可以Win32_BIOS |選擇-對象的SerialNumber」 純文本

爲什麼錯誤是Invoke-Command:一個或多個計算機名稱無效。如果您嘗試傳遞URI,請使用-Co​​nnectionUri參數,或傳遞URI對象 而不是字符串。 ?

我甚至試圖用$ serverlist.toString()替換$ serverlist,但它不工作。我在某處讀到,在這種情況下,$ serverlist是一個Array,我該怎麼辦才能使所有的工作?

考慮到https://technet.microsoft.com/en-us/library/hh849719.aspx如果通過控制檯輸入字符串,則調用命令可以使用「server1,server2,server3」格式。

回答

0

有關爲何如您所願,請參閱parsingcommand syntax幫助文件這不起作用進一步的瞭解:

Get-Help about_Parsing 
Get-Help about_Command_Syntax 

$服務器列表

當你的文本文件包含行server1,server2,server3,這個命令:

Get-Content -Path .\file.txt | Out-String 

只會導致字符串server1,server2,server3和換行符 - 這不是有效的主機名。

兩種格式類似這樣的文本文件(Get-Content自動拆分的換行符):

server1 
server2 
server3 

或從文件自行分割字符串(S):

$Serverlist = Get-Content -Path $Path | ForEach-Object { $_ -split "," } 

$命令塊

對於命令塊部分的工作,你不能只將一個字符串放入一個腳本塊,並期望它執行 - 你需要重新創建爲可執行代碼:

$Code = Get-Content -Path $path -Raw 
$CommandBlock = [scriptblock]::Create($Code) 

# Now you can do this 
Invoke-Command -ScriptBlock $CommandBlock 
1

$serverList是不是一個列表,它是server1,server2等一個字符串,使之變成一個數組,你可以使用-split用逗號分割字符串。

$serverList = Get-Content -Path $path | Out-String 
$serverList = $serverList -split "," 
+0

事情是「server1,server2,server3」是invoke-command需要正常工作的東西。我不需要分手!不是嗎? – BlacK

+1

@BlacK當您輸入'server1,server2,server3'作爲裸參數時,PowerShell解析器會認識到它應該被視爲三個單獨的字符串,而不是單個字符串。當你傳遞一個變量時,情況並非如此 –

+0

你這樣做,就好像你正在傳遞一個變量,它的值是未解析的,所以你的'gwmi'命令搜索名爲'server1,server2,server3'的計算機而不是去三臺電腦'server1','server2','server3'。但是如果你的'$ serverList'是一個數組,那麼'gwmi'將會看到它並在每臺計算機上進行調用。 – Vesper