检索参数从文件- Windows PowerShell



我正在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

相关内容

  • 没有找到相关文章

最新更新