I'm trying to check if multiple files/folders exist. The Test-Path parameter -Path accepts a [string[]] array. Please see example code:
$arr = @(
"C:\a\fake\path\test1.txt",
"C:\another\fake\path\test2.txt",
"C:\not\a\path\test3.txt",
"Z:\not\a\path"
)
if (Test-Path -Path $arr) {
$true
} else {
$false
}
Output: $true
None of the paths in $arr are valid. They do not exist (I don't have a Z: drive) -- what is happening here?
Building on the helpful comments:
Test-Pathdoes support passing an array of paths (both by argument and via the pipeline, but it outputs a Boolean value ($trueor$false) indicating the existence of a path for each input path.That is, with 4 input paths, as in your example, you'll get 4 Boolean output values.
Coercing an array with two ore more elements - irrespective of the type of its elements - to a single Boolean, such as in the context of an
ifstatement's conditional, always yields$true; e.g.:(By contrast, a single-element array is coerced the same way as its single element itself, so that
[bool] @($false)is effectively the same as[bool] $falseand therefore$false).See the conceptual about_Booleans help topic for more information.
If you want to know if at least one of the input paths doesn't exist, use the
-containsoperator:(Conversely,
-contains $truetells if you at least one path exists.)