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 $_
}
我这里有这个 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 $_
}