我有一个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
这就是为什么代码在运行,但是我真的不明白为什么。
答案 0 :(得分:0)
语句$1044 = Get-ChildItem $Path | Where {$_.Name -match $Pattern}
可以返回任意数量的结果(零,一个或多个)。
如果返回零结果,则变量$1044
将为空,因此$strFileName = "C:\test\" + $1044
的计算结果仅为C:\test\
,Test-Path
将(正确)报告为现有。 / p>
如果返回多个结果,则变量$1044
将包含文件或文件夹对象的列表。进行$strFileName = "C:\test\" + $1044
会将列表混成一个用空格分隔的文件/文件夹名称字符串,并将其附加到基本路径中(这意味着您将得到类似C:\test\1044foo bar1044 1044_baz
的内容,而不是C:\test\1044foo
, C:\test\bar1044
,C:\test\1044_baz
)。该路径不存在,因此Test-Path
在这种情况下将始终评估为false。
此外,您不需要首先通过字符串连接来构建$strFileName
(除非您的基本路径与Get-ChildItem
所使用的路径不同),因为{{ 1}}已具有具有完整路径(Get-ChildItem
)的属性。而且您也不需要测试路径是否存在,因为FullName
如果不存在,就不会返回任何项。
将您的代码更改为以下内容:
Get-ChildItem
,它应该可以满足您的期望,因为PowerShell会将$1044 = Get-ChildItem $Path | Where-Object {$_.Name -match $Pattern}
if ($1044) {
...
}
评估为$1044
(如果为空),将评估为$false
(如果不为空)。
答案 1 :(得分:0)
如果模式不复杂,则可以将测试路径与通配符一起使用,而不必使用get-childitem
$Path="C:\test\*"
$Patern="*1044*"
if (Test-Path -Path $Path -Filter $Patern -PathType Leaf)
{
"File whith patern exist"
}