从文件中检索参数 - Windows PowerShell

问题描述:

我在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”格式。

有关为何如您所愿,请参阅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 

$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