从文件中检索参数 - Windows PowerShell
Retrieve parameters from file - 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" 格式。
要进一步了解为什么这不能按您预期的那样工作,请参阅 parsing and 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 "," }
$commandblock
要使命令块部分起作用,您不能只是将字符串放入 ScriptBlock 中并期望它执行 - 您需要将其重新创建为可执行代码:
$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 ","
我正在用 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" 格式。
要进一步了解为什么这不能按您预期的那样工作,请参阅 parsing and 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 "," }
$commandblock
要使命令块部分起作用,您不能只是将字符串放入 ScriptBlock 中并期望它执行 - 您需要将其重新创建为可执行代码:
$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 ","