从文件中读取多个变量的Powershell脚本

Powershell script to read multiple variable from file

我有一个在远程计算机上调用会话的脚本和 运行 一个脚本。

$pw = convertto-securestring -AsPlainText -Force -String '$(PWD_vSphere_AdminUser)'
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist ".\Administrator",$pw
Invoke-Command -Credential $Cred -ComputerName 'testcomputer' -FilePath "./addvm.ps1" 

这很好用。现在我必须在多台计算机上 运行 它。我想从 tfvars 文件(json 格式)中读取 -ComputerName 值。其中 name = "testcomputer" 出现多次。我想从 tfvars 文件(json 格式)和 运行 我的脚本中读取每个“名称”值的这个“名称”值。

    {
  "vm": [
    {
      "testcomputer": [
        {
          "memory": "4096",
          "name": "testcomputer",
          "time_zone": "020"
        }
      ],
      "testcomputer1": [
        {
          "memory": "4096",
          "name": "testcomputer1",
          "time_zone": "020"
        }
      ],
      "testcomputer2": [
        {
          "memory": "4096",
          "name": "testcomputer2",
          "time_zone": "020"
        }
      ]
    }
  ]
}

我读过这篇文章Powershell retrieving a variable from a text file,但这并不能解决很多问题。

如果您分享的内容确实是您将获得的输入,一种处理方法是使用正则表达式,但如果可以某种方式将其作为对象输入,JSON 或 XML 或任何可以读取并正确转换为对象的东西,你应该这样做而不是正则表达式。

从正则表达式开始,从字面上读取您显示的输入,您可以这样做:

$inputVar = @"
vm = {
    "testcomputer" = {
        name = "testcomputer"
        memory = "4096"
        time_zone = "020"
    }
    "testcomputer1" = {
        name = "testcomputer1"
        memory = "4096"
        time_zone = "020"
    }
    "testcomputer2" = {
        name = "testcomputer2"
        memory = "4096"
        time_zone = "020"
    }
}
"@


#the matching pattern.
$regexFormat = '(?<=name = ").[^"]*'

#Grab only the matching pattern items.
$computerList = [regex]::Matches($inputVar, $regexFormat) | ForEach-Object { $_.value }

foreach ($computer in $computerList) {

    $pw = convertto-securestring -AsPlainText -Force -String '$(PWD_vSphere_AdminUser)'
    $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist ".\Administrator", $pw
    Invoke-Command -Credential $Cred -ComputerName $computer -FilePath "./addvm.ps1"

}

我用 $inputVar 进行了字面输入只是为了展示示例,然后您可以对每台计算机执行 foreach 循环 运行 您的代码。