我在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"
为什么错误是Invoke-Command:一个或多个计算机名称无效。如果您尝试传递URI,请使用-ConnectionUri参数,或传递URI对象 而不是字符串。 ?
我甚至尝试用$ serverlist.toString()替换$ serverlist,但它不起作用。我在某个地方看过,在这种情况下$ serverlist是一个数组,我怎么做才能让一切工作?
考虑https://technet.microsoft.com/en-us/library/hh849719.aspx Invoke-Commands与" server1,server2,server3"如果你通过控制台放置字符串格式。
答案 0 :(得分:1)
您的$serverList
不是列表,而是server1,server2
等单个字符串。要将其设置为数组,您可以使用-split
以逗号分割字符串。< / p>
$serverList = Get-Content -Path $path | Out-String
$serverList = $serverList -split ","
答案 1 :(得分:0)
为了进一步了解为什么它没有按预期工作,请参阅parsing和command 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
或者自己从文件中拆分字符串:
$Serverlist = Get-Content -Path $Path | ForEach-Object { $_ -split "," }
要使命令块部分起作用,您不能只是将字符串放入ScriptBlock并期望它执行 - 您需要将其重新创建为可执行代码:
$Code = Get-Content -Path $path -Raw
$CommandBlock = [scriptblock]::Create($Code)
# Now you can do this
Invoke-Command -ScriptBlock $CommandBlock