如何解决Powershell foreach 帮助有人可以帮忙让它只循环一次吗?
举个例子,我想说
robocopy "C:\SCRIPT TEST" "C:\NEW TEST" /Z /W:5 /MIR /LOG+:$Logfile
robocopy "C:\SCRIPT TEST 2" "C:\NEW TESTT" /Z /W:5 /MIR /LOG+:$Logfile
并且不要循环多次。有没有办法同时运行 foreach 循环?我希望它清楚谢谢!
$Logfile = "C:\NEW TEST 2\robocopylog.txt"
$sources = @("SCRIPT TEST","SCRIPT TEST 2")
$destinations = @("NEW TEST","NEWTESTT")
foreach ($source in $sources){
foreach ($destination in $destinations){
robocopy "C:\$source" "C:\$destination" /Z /W:5 /MIR /LOG+:$Logfile
}
}
解决方法
你可以使用 for 循环
$Logfile = "C:\NEW TEST 2\robocopylog.txt"
$sources = @("SCRIPT TEST","SCRIPT TEST 2")
$destinations = @("NEW TEST","NEWTESTT")
for($i = 0; $i -lt $sources.Count; $i++){
Write-Host robocopy "C:\$($sources[$i])" "C:\$($destinations[0])" /Z /W:5 /MIR /LOG+:$Logfile
}
但我真的建议您重新考虑您的方法。我认为哈希表或 PSCustomObject 会是更合适的存储结构。
$paths = @{
Source = "SCRIPT TEST"
Destination = "NEW TEST"
},@{
Source = "SCRIPT TEST 2"
Destination = "NEWTESTT"
}
$paths.GetEnumerator() | ForEach-Object {
Write-Host robocopy "C:\$($_.source)" "C:\$($_.destination)" /Z /W:5 /MIR /LOG+:$Logfile
}
或
$paths = [PSCustomObject]@{
Source = "SCRIPT TEST"
Destination = "NEW TEST"
},[PSCustomObject]@{
Source = "SCRIPT TEST 2"
Destination = "NEWTESTT"
}
foreach($path in $paths){
Write-Host robocopy "C:\$($path.source)" "C:\$($path.destination)" /Z /W:5 /MIR /LOG+:$Logfile
}
,
我会通过索引来寻址数组,而不是使用 foreach
迭代器。然后将 $source[$i]
复制到 $destination[$i]
,类似于:
if ($sources.length -ne $destinations.length) {
throw "Number of sources does not match number of destinations"
}
for ($i = 0; $i -lt $sources.Length; $i++) {
"$($sources[$i]) -> $($destinations[$i])"
}
第一个检查存在的原因很明显。在 robocopy 中交换应该是相当简单的。
,如果您传递具有 2 个元素的数组并具有嵌套循环,这就是它的作用 - 它将为每个元素循环。
你想要的是一个二维数组和一个循环:
$sources = @( ("SCRIPT TEST","NEW TEST"),("SCRIPT TEST 2","NEWTESTT") )
foreach ($source in $sources)
{
robocopy "C:\$($source[0])" "C:\$($source[1])" /Z /W:5 /MIR /LOG+:$Logfile
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。