如何检查特定文件是否在文件夹中并写入主机是否存在

How can I check if specific files are within a folder and write to host if they are present or not

我正在尝试检查文件夹中是否存在文件列表,如果它们确实存在,则写入它们存在的主机,如果不存在,则写入它们不存在的主机。

我的代码可以检查是否所有文件都存在,但是当尝试写入控制台时,即使文件丢失,它也总是评估工作。

对于 $msis 中的每个文件,如果存在于文件夹

中,这将 return 为真

        $Instance = "TEST"
        $msipath = "D:\CCS${Instance}\"
        $msis = @("${msipath}CCS1.msi", "${msipath}CC2.msi", "${msipath}CCS3.msi", "${msipath}CCS4.msi")
        foreach($msi in $msis){
          $test = (Test-Path $msi) -PathType leaf)
          write-host "$test"
    }
      

我添加了 if else 语句来检查 $test 是否为真 write-host "I Work" else write-host "I Fail"

我的问题是,即使文件丢失,它仍然会评估为“我工作”,只有当所有文件都不存在时,它才会评估为“我失败”。

我想做的是,如果一个或多个文件丢失,让它写入主机“我失败了”。


  if ($test -eq 'True')
  { write-host "I work" }
  else
  {
  write-host "I fail"
  }

如果我理解你的问题:

$Instance = "TEST"
$msipath = "D:\CCS${Instance}\"
$msis = @("${msipath}CCS1.msi", "${msipath}CC2.msi", "${msipath}CCS3.msi", "${msipath}CCS4.msi")
$test = $true
foreach($msi in $msis){
    $test = $test -and (Test-Path $msi -PathType leaf)
    if (-not $test) { break } # immediately exit the loop on the 1st False
}
write-host "$test"

阅读Using break in loops

稍作休息并重新访问后,我现在设法稍微更改了我的脚本以使其正常工作。


    $Instance = "TEST"
    $msipath = "D:\CCS${Instance}\"
    $msis = @("${msipath}CCS1.msi", "${msipath}CCS2.msi", "${msipath}CCS3.msi", "${msipath}CCS4.msi")
    
    if (($msis | foreach {test-path $msis}) -contains $false)
    {
        write-host "I Fail"
    }
    else
    {
        write-host "I Work"
    }

如果 $msis 中的任何文件丢失,这现在将显示“我失败了”。

Test-Path -Path<string[]>为输入,也就是说,它可以评估多条路径,这里不需要循环:

$Instance = "TEST"
$msipath = "D:\CCS$Instance"
$msis = 'CCS1.msi', 'CCS2.msi', 'CCS3.msi', 'CCS4.msi' | ForEach-Object {
    Join-Path $msipath -ChildPath $_
}

If((Test-Path $msis).Contains($false))
{
    write-host "I Fail"
}
else
{
    write-host "I Work"
}