Powershell foreach 循环遍历从用户输入中拆分出来的列表

Powershell foreach loop through a list that is split from user input

我这里有这个 for 循环:

$fromInput = 1
$toInput = 99

for ($i = $fromInput; $i -le $toInput; $i++) {
            
    $destinationDir = '\pc' + '{0:d5}' -f @($i) + "$shareName$dupDir"
    $netUseDir = '\pc' + '{0:d5}' -f @($i) + "$shareName"
    $passObj = 'pass@' + '{0:d3}' -f @($i)
        
    }

所以它会从 1 到 99 遍历 PC,但我现在需要的是遍历用户输入的数字列表

我正在尝试使用 foreach 循环来做到这一点,但它对我来说并不像 for 循环中的那样工作:

$userInput = Read-Host "Input numbers divided by a comma [", "]"
$numberList = $userInput.split(", ")

foreach ($i in $numberList) {

    $destinationDir = '\pc' + '{0:d5}' -f @($i) + "$shareName$dupDir"
    $netUseDir = '\pc' + '{0:d5}' -f @($i) + "$shareName"
    $passObj = 'pass@' + '{0:d3}' -f @($i)

    }

我如何制作一个 foreach 循环,它接受 $userInput,将其拆分为 $numberList,然后按照上面显示的方式循环 $numberList 中的每个数字。 非常感谢您一如既往的帮助!

主要问题是您将格式设置 (d5) 应用于用于整数类型的字符串。您可以简单地转换为 [int] 以获得所需的结果。

foreach ($i in $numberList) {

    $destinationDir = '\pc' + '{0:d5}' -f [int]$i + "$shareName$dupDir"
    $netUseDir = '\pc' + '{0:d5}' -f [int]$i + "$shareName"
    $passObj = 'pass@' + '{0:d3}' -f [int]$i

    }

Read-Host 将数据读取为 [string]。如果出于某种原因该数据需要不同类型,则无论是隐式还是显式都需要进行转换。

首先,对于用户输入,我建议您使用这样的东西:

$userInput = Read-Host "Input numbers divided by a comma [", "]"
try
{
    [int[]]$numberList = $userInput.split(',')
}
catch
{
    'Input only numbers separated by commas.'
    break
}

解释为什么有 [int[]] 以及为什么有 try {...} catch {...} 语句:

我们正在尝试将 string 转换为 array,并将生成的元素转换为 int。结果我们应该得到一个整数数组,如果不是这种情况,这意味着如果用户输入的内容不同于用逗号分隔的数字,我们将得到一个错误,该错误由 catch 块捕获和处理.

在这种情况下,需要通过向您展示一个简单示例来将字符串转换为整数:

PS /> '{0:d5}' -f '1' # String formatting on a string
1

PS /> '{0:d5}' -f 1 # String formatting on an integer
00001

现在循环,这是我看到的 3 个简单的替代方法:

  • 使用 for 循环:
for($i=$numberList[0];$i -le $numberList.Count;$i++)
{
    $destinationDir = "\pc{0:d5}$shareName$dupDir" -f $i
    $netUseDir = "\pc{0:d5}$shareName" -f $i
    $passObj = 'pass@{0:d3}' -f $i
}
  • 使用 foreach 循环:
foreach($i in $numberList)
{
    $destinationDir = "\pc{0:d5}$shareName$dupDir" -f $i
    $netUseDir = "\pc{0:d5}$shareName" -f $i
    $passObj = 'pass@{0:d3}' -f $i
}
  • 使用 ForEach-Object 循环:
$numberList | ForEach-Object {
    $destinationDir = "\pc{0:d5}$shareName$dupDir" -f $_
    $netUseDir = "\pc{0:d5}$shareName" -f $_
    $passObj = 'pass@{0:d3}' -f $_
}