我正在将PowerShell副本文件用于多个位置,然后在copy
完成后进行检查,如果其中一个目标上不存在一个或多个文件,我想在失败时发送消息。
$SRCDIR1 = "C:\temp\Copy\00_S"
$DST = "C:\temp\Copy\01_D","C:\temp\Copy\02_D","C:\temp\Copy\03_D"
$File_list = Get-ChildItem -Path $SRCDIR1\*.xml
$DST | %{ Copy-Item $SRCDIR1\*.xml -Destination $_ }
Foreach ($item in $File_list) {
If (Test-Path $DST ) {
Write-Host $item exists in $DST
}
else {
Write-Host $item DOES NOT exists in $DST
}
}
当所有文件都在所有目的地时它起作用,但是如果我从不同的目的地删除不同的文件测试"写主机如果不存在",它仍然是#34; write-host"一切都存在。
失败时,我想要它"写主机"哪个文件不存在于哪个目的地分开。我该如何修改代码?
更新使其正常运行。必须循环循环....
$FileList = Get-ChildItem -Path $SRCDIR1\*.xml | Select -ExpandProperty Name
Foreach ($item in $FileList){
$DST |
% {if (Test-Path ($_ + "\" + "$item")){
write-host $item exist in $_ -ForegroundColor Green
}else{
write-host $item does not exist in $_ -ForegroundColor Red
}
}
}
答案 0 :(得分:0)
您的$DST
是一个字符串数组,这是"问题" ,因为Test-Path
将为每个路径返回一个布尔值阵列:
PS> $DST = "C:\temp\Copy\01_D","C:\temp\Copy\02_D","C:\temp\Copy\03_D"
PS> Test-Path $DST
True
True
False
这意味着if(Test-Path $DST)
与if(@($true, $true, $false))
相同。让我们看看他们是如何评估的:
PS> if ($false) {"HA!"} else {"Ney"}
Ney
PS> if (@($false, $false)) {"HA!"} else {"Ney"}
HA!
正如您所看到的,if ($variable)
评估为$true
,当$variable
是任何非{null}的非空值时,所以即使$false
也是如此评估为@($false, $false, $false)
。
请勿检查$true
,而是检查$DST
的存在:
$item