我有两种使用通配符模式获取文件的方式:
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失败?
答案 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