首页 > 解决方案 > PowerShell测试文件是否在文件夹中错误

问题描述

我有一个 PowerShell 代码,我想检查文件夹中是否包含特定模式的文件。

如果有特定模式的文件,那么我想继续工作。

我有它:

$path = "c:\test\"
$Pattern = "1044"
$1044 = Get-ChildItem $Path | Where {$_.Name -match $Pattern}
$strFileName = "C:\test\" + $1044

if (Test-Path $strFileName) {
    ...
}

问题是即使带有模式的文件不存在,代码也会继续运行。

我打印了$1044它,它说

找不到文件

我还打印了if条件,上面写着:

找不到文件真

这就是代码正在运行的原因,但我真的不明白为什么。

标签: powershell

解决方案


该语句$1044 = Get-ChildItem $Path | Where {$_.Name -match $Pattern}可以返回任意数量的结果(零个、一个或多个)。

如果它返回零结果,则变量$1044将为空,因此$strFileName = "C:\test\" + $1044将评估为 just C:\test\Test-Path它将(正确)报告为存在。

如果它返回多个结果,他的变量$1044将包含文件或文件夹对象的列表。这样做$strFileName = "C:\test\" + $1044会将这个列表变成一个以空格分隔的文件/文件夹名称字符串,并将其附加到基本路径(这意味着你会得到类似的东西,C:\test\1044foo bar1044 1044_baz而不是C:\test\1044foo, C:\test\bar1044, C:\test\1044_baz)。这条路径不存在,因此Test-Path在这种情况下总是会评估为假。

此外,您不需要首先$strFileName通过字符串连接构建(除非您的基本路径与使用的路径不同Get-ChildItem),因为返回的对象Get-ChildItem已经具有完整路径(FullName)的属性。而且您也不需要测试路径是否存在,因为Get-ChildItem如果它不存在,就不会返回一个项目。

将您的代码更改为以下内容:

$1044 = Get-ChildItem $Path | Where-Object {$_.Name -match $Pattern} 

if ($1044) {
    ...
}

它应该按照您的预期进行,因为 PowerShell 会评估它是否$1044$false空以及$true是否为空。


推荐阅读