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条件,上面写着:

找不到文件 True

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

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

如果它返回零结果,则变量$1044将为空,因此$strFileName = "C:test" + $1044的计算结果仅为C:testTest-Path将(正确(报告为存在。

如果它返回多个结果,则变量$1044将包含文件或文件夹对象的列表。这样做$strFileName = "C:test" + $1044会将此列表分解为以空格分隔的文件/文件夹名称字符串,并将其附加到基本路径(这意味着您将获得类似C:test1044foo bar1044 1044_baz的内容,而不是C:test1044fooC:testbar1044C:test1044_baz(。此路径不存在,因此在这种情况下Test-Path将始终计算为 false。

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

将代码更改为如下所示的内容:

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

它应该执行你期望的操作,因为 PowerShell 评估$1044$false它是否为空,如果它不是,则$true

如果你的父亲不复杂,你可以使用带有通配符的测试路径,不必使用 get-childitem

$Path="C:test*"
$Patern="*1044*"
if (Test-Path -Path $Path -Filter $Patern -PathType Leaf)
{
"File whith patern exist"
}

最新更新