Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell foreach帮助。有人能帮忙让它只循环一次吗?_Powershell_Loops_For Loop_Foreach_Robocopy - Fatal编程技术网

Powershell foreach帮助。有人能帮忙让它只循环一次吗?

Powershell foreach帮助。有人能帮忙让它只循环一次吗?,powershell,loops,for-loop,foreach,robocopy,Powershell,Loops,For Loop,Foreach,Robocopy,举个例子,我想说 机器人副本C:\SCRIPT TEST C:\NEW TEST/Z/W:5/MIR/LOG+:$Logfile 机器人副本C:\scripttest2C:\newtestt/Z/W:5/MIR/LOG+:$Logfile 不要重复循环一次。有办法同时运行foreach循环吗?我希望它清楚谢谢你 $Logfile = "C:\NEW TEST 2\robocopylog.txt" $sources = @("SCRIPT TEST", &

举个例子,我想说

机器人副本C:\SCRIPT TEST C:\NEW TEST/Z/W:5/MIR/LOG+:$Logfile

机器人副本C:\scripttest2C:\newtestt/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

}
}

我将通过索引来处理数组,而不是使用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 is中的交换应该相当简单。

我会通过索引来寻址数组,而不是使用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 is中进行交换应该相当简单。

您可以使用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
}


您可以使用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
}


如果传递包含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
}

如果传递包含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
}

许多不同的来源和目的地都需要它,因此需要一个循环。到目前为止,没有一个答案是有效的…许多不同的来源和目的地都需要它,所以循环是必要的。到目前为止,所有答案都不起作用…在Powershell 5和可能更高版本中,不确定何时您甚至不必转换为PSCustomObject来访问类似于属性的密钥。在Powershell 5和可能更高版本中,不确定何时您甚至不必转换为PSCustomObject来访问类似于属性的密钥。