PowerShell测试文件是否在文件夹错误中

时间:2018-10-06 08:07:07

标签: 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

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

2 个答案:

答案 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\1044fooC:\test\bar1044C:\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"
}