Get-ChildItem,通配符和过滤

时间:2018-11-28 22:59:49

标签: powershell powershell-v5.1

我有两种使用通配符模式获取文件的方式:

Get-ChildItem "$ActivityLogDirectory/*.csv"

Get-ChildItem "$ActivityLogDirectory" -Filter *.csv

我更喜欢使用后者而不是前者,因为前者(Get-ChildItem "$ActivityLogDirectory/*.csv")有时会给我一个权限被拒绝的错误。

它们似乎都返回相同的结果,但是当我尝试使用以下命令压缩结果文件时:

Compress-Archive -Update -Path $CsvFiles -DestinationPath C:\Users\admin\Downloads\foo.zip

前者成功,而后者失败并出现以下错误:

Compress-Archive : The path 'rgb dev automation store a_1-1_2194_20181120.csv'
either does not exist or is not a valid file system path.
At line:1 char:1
+ Compress-Archive -Update -Path $CsvFiles -DestinationPath C:\Users\ad ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (rgb dev automat...94_20181120.csv:String) [Compress-Archive], InvalidOperationException
    + FullyQualifiedErrorId : ArchiveCmdletPathNotFound,Compress-Archive

那么这两种使用通配符获取文件列表的方式有什么区别?或以另一种方式问到,为什么使用-Filter *.csv导致Compress-Archive cmdlet失败?

enter image description here

2 个答案:

答案 0 :(得分:2)

您看到不同行为的原因是-情况模糊-Get-ChildItem输出的对象的字符串化行为:

This answer详细说明了Get-ChildItem输出恰好被字符串化为纯文件名完整路径时的情况,因此{{ 1}}只能是文件名。

解决方法是通过对象的Get-ChildItem "$ActivityLogDirectory" -Filter *.csv属性(PSv3 +语法)将对象明确字符串化为其完整路径

FullName

答案 1 :(得分:1)

如果您是通过外壳程序运行的,并且外壳程序具有CSV文件所在的文件夹的位置,那么它将起作用。通过将$CsvFiles变量传递到Compress-Archive来执行的操作试图在当前上下文中针对文件名运行。要解决此问题,请通过完整路径$CsvFiles.FullName

$Csvfiles = (Get-Childitem $ActivityLogDirectory -Filter *.csv)
Compress-Archive -Update -Path $Csvfiles.fullname -DestinationPath C:\Users\admin\Downloads\foo.zip