我有一个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:test
,Test-Path
将(正确(报告为存在。
如果它返回多个结果,则变量$1044
将包含文件或文件夹对象的列表。这样做$strFileName = "C:test" + $1044
会将此列表分解为以空格分隔的文件/文件夹名称字符串,并将其附加到基本路径(这意味着您将获得类似C:test1044foo bar1044 1044_baz
的内容,而不是C:test1044foo
、C:testbar1044
、C: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"
}