powershell - 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
条件,上面写着:
找不到文件真
这就是代码正在运行的原因,但我真的不明白为什么。
解决方案
该语句$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
是否为空。
推荐阅读
- matlab - 在 for 循环 Matlab 中保存和比较值
- python - Argparse 条件可选位置参数?
- go - 为什么将reflect.Value传递给golang中的接口时不能使用Pointer()方法?
- amazon-vpc - AWS VPN 隧道已建立并能够相互 ping,但 curl 不起作用
- google-cast - 自定义接收器应用程序中的授权处理
- mysql - MySQL 锁定方案
- javascript - 在另一个事件侦听器中添加事件侦听器
- java - JPA findAll(Pageable pageable)不返回数据
- python - 不同函数调用之间的延迟
- sql - 雪花中实现sql“JOIN”返回策略的最佳实践