【问题标题】:Retrieve parameters from file - Windows PowerShell从文件中检索参数 - Windows PowerShell
【发布时间】:2015-07-20 13:32:00
【问题描述】:

我正在 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 替换为 $serverlist.toString() 但它不起作用。我在某处读到,在这种情况下 $serverlist 是一个数组,我该怎么做才能使一切正常?

如果您通过控制台输入字符串,请考虑https://technet.microsoft.com/en-us/library/hh849719.aspx Invoke-Commands 使用“server1,server2,server3”格式。

【问题讨论】:

    标签: windows powershell server-administration


    【解决方案1】:

    您的$serverList 不是一个列表,它是server1,server2 等的单个字符串。要使其成为一个数组,您可以使用-split 将字符串用逗号分隔。

    $serverList = Get-Content -Path $path | Out-String
    $serverList = $serverList -split ","
    

    【讨论】:

    • 问题是“server1,server2,server3”是调用命令正常工作所需要的。我不需要分开!不是吗?
    • @BlacK 当您输入 server1,server2,server3 作为裸参数时,PowerShell 解析器会识别出它应该被视为三个单独的字符串,而不是单个字符串。当您将变量传递给它时,情况并非如此
    • 你这样做,就好像你在传递一个变量,它的值是未经解析的,所以你的gwmi命令搜索一台名为server1,server2,server3的计算机,而不是搜索三台计算机server1server2server3。但是如果你的$serverList 是一个数组,那么gwmi 会看到它并在每台计算机上进行调用。
    • @BlacK 由于Out-String,最后一个条目仍然有一个尾随换行符,请参阅下面的答案
    • @Vesper,您可以使用此​``"[`r`n]"``​ 获取此"[`r`n]"
    【解决方案2】:

    要进一步了解为什么这不能按预期工作,请参阅 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
    

    或自己从文件中拆分字符串:

    $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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多