我正在PowerShell中编写一个超级简单的脚本。该脚本的目标是从一个txt文件中读取服务器名称列表,并从另一个txt文件中读取命令块。操作的结果应该是包含信息的第三个txt文件。
下面是一些代码: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是一个纯文本,包含类似"server1,server2,server3"的内容,而command.txt只包含这个"Get-WmiObject Win32_BIOS | Select-Object SerialNumber"
为什么错误是调用命令:一个或多个计算机名称无效。如果您试图传递一个URI,请使用-ConnectionUri参数,或者传递URI对象而不是字符串。
?我甚至试图用$serverlist. tostring()代替$serverlist,但它不起作用。我在某个地方读到,在这种情况下$serverlist是一个数组,我怎么做,使一切工作?
考虑https://technet.microsoft.com/en-us/library/hh849719.aspx Invoke-Commands工作与"server1,server2,server3"格式,如果你把字符串通过控制台
您的$serverList
不是一个列表,它是server1,server2
等的单个字符串。要使其成为一个数组,您可以使用-split
将字符串用逗号分隔。
$serverList = Get-Content -Path $path | Out-String
$serverList = $serverList -split ","
要进一步了解为什么这不能像您期望的那样工作,请参阅解析和命令语法帮助文件:
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
或者自己从文件中拆分字符串:
$Serverlist = Get-Content -Path $Path | ForEach-Object { $_ -split "," }
<标题>美元commandblock h1> 使命令块部分工作,您不能只是将字符串放入ScriptBlock中并期望它执行—您需要将其重新创建为可执行代码:
$Code = Get-Content -Path $path -Raw
$CommandBlock = [scriptblock]::Create($Code)
# Now you can do this
Invoke-Command -ScriptBlock $CommandBlock
标题>标题>