PowerShell检查文件:foreach循环失败

时间:2017-12-11 14:55:23

标签: powershell

我正在将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  

        }

       }

    }

1 个答案:

答案 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