powershell中的循环和数组的数组

k4aesqcs  于 2023-02-19  发布在  Shell
关注(0)|答案(2)|浏览(157)

我希望有人能帮助我。我是powershell的新手,正在努力寻找正确的方法来处理我的脚本中的一些东西。脚本是使用veeam powershell命令对我们的备份进行恢复检查。我们有7个备份作业,每个作业中有不同的服务器,每个作业中有不同的驱动器被备份。有时,服务器处于多个作业中,因为我们每天将备份作业拷贝到USB时必须跨作业拆分驱动器(所以我们必须平衡每个作业中备份的数据量,以便可以将驱动器复制到USB驱动器)。我可以编写整个脚本并使其工作,但它大约有800行长,效率非常低,虽然我的团队很容易理解(稍后还有我!)我目前的方法几乎是围绕着为每个备份作业执行某些操作,然后在每个磁盘上为该作业中的每个服务器执行某些操作。我想使用阵列/循环来减少它。我已经想出了如何使用基本循环和阵列,但我正在为能够链接阵列中的驱动器和服务器而挣扎,例如:

$Backupjob1 = "Backup Job 1E"
$Backupjob1Servers =@('Server1','Server2')

某种阵列,允许服务器1和服务器2使用不同数量的多个驱动器。

$Backupjob1ServeDrives =@(Server1.Drive1 ='C', Server1.Drive2 ='F', Server2.Drive1 = 'C')

然后我需要遍历它,以便在每次循环中,它在server 1上执行一个操作,然后在第一个驱动器上执行下一个驱动器。一旦server 1完成,它在server 2上的第一个驱动器上执行该操作,然后在第二个驱动器上重复。
我理解循环遍历数组的基本知识,但我很难理解如何创建一个数组的数组,可以处理上述问题,然后正确地循环遍历它。
我被困在不确定什么阵列工作,有什么选项。

2hh7jdfx

2hh7jdfx1#

一种方法是将你的配置外部化到一个json文件或类似的文件中,然后将其提供给你的脚本。下面是一个使用json字符串的例子:

$serverConfig = @"
[{
    "serverName": "server1",
    "backupDrives": [
        "D","F"
    ]
},
{
    "serverName": "server2",
    "backupDrives": [
        "D","G","H"
    ]
}]
"@

$serverList = $serverConfig | ConvertFrom-Json

foreach($server in $serverList) {
  Write-Host "Server: $($server.serverName)"

  foreach($drive in $server.backupDrives) {
    Write-Host "Backing up drive $drive..."
    # Logic for the backup 
  }
}

这演示了如何处理所引用的数组的数组,您有一个服务器对象数组,每个服务器对象都有一个驱动器数组,因此在服务器的每次迭代中,您也要迭代服务器的驱动器。
如果您将字符串保存到配置文件中,则脚本可以读取该字符串,然后如果您对备份配置进行任何更改,则只需更改配置文件,而无需更改脚本。

qncylg1j

qncylg1j2#

听起来你想要一个 * 字典 * 类型--谢天谢地,PowerShell有一个内置的无序字典类型,叫做 * 哈希表 *。
要构造哈希表文本,请使用@{...}而不是@(...)

$driveMapping = @{
    Server1 = @{
      Drive1 = 'C'
      Drive2 = 'F'
    }
    Server2 = @{
      Drive1 = 'C'
    }
}

要遍历此数据结构,请使用一个简单的嵌套循环:

foreach($server in $drivemapping.psbase.Keys){
    Write-Host "About to backup the drives on server '$server'"
    foreach($drive in $drivemapping[$server].psbase.Keys){
        $driveLetter = $drivemapping[$server][$drive]
        Write-Host "About to backup drive '$drive' with letter '$driveLetter' on server '$server'"
    }
}

相关问题