【问题标题】:Get-ChildItem and wildcards and filteringGet-ChildItem 和通配符和过滤
【发布时间】:2018-11-29 10:13:07
【问题描述】:

我有两种不同的方式来获取带有通配符模式的文件:

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

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

压缩存档:路径“rgb dev 自动化存储 a_1-1_2194_20181120.csv” 要么不存在,要么不是有效的文件系统路径。 在行:1 字符:1 + 压缩存档 - 更新 -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 失败?

【问题讨论】:

  • 文件名中可能有一个奇怪的字符导致您出现该错误。你试过-LiteralPath而不是-Path吗?
  • @Lee_Dailey 是的,我试过 LiteralPath,结果是一样的
  • 嗯,这是一个简单的修复,不是修复。 [sigh ...] ///// 如果你去掉这行中完全不需要的引号会发生什么Get-ChildItem "$ActivityLogDirectory" -Filter *.csv
  • @Lee_Dailey 我也试过了,没有任何改变
  • 哎哟!我没有想法......我会回去潜伏。祝你好运!

标签: powershell powershell-v5.1


【解决方案1】:

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

This answer 详细说明当 Get-ChildItem 输出碰巧字符串化为 单纯的文件名完整路径 时,Get-ChildItem "$ActivityLogDirectory" -Filter *.csv 恰好被字符串化为单纯的文件名。

解决方法 是通过对象的FullName 属性(PSv3+ 语法)将对象显式字符串化为它们的完整路径

$CsvFiles = (Get-ChildItem "$ActivityLogDirectory" -Filter *.csv).FullName

【讨论】:

    【解决方案2】:

    如果您从带有 CSV 文件所在文件夹位置的 shell 运行此程序,那么这将起作用。您通过将$CsvFiles 变量传递给Compress-Archive 所做的事情是试图在当前上下文中针对文件名运行。要解决此问题,请传递完整路径 $CsvFiles.FullName:

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

    【讨论】:

    • 您的答案让Compress-Archive 起作用,但我仍然想知道将Get-ChildItem 与通配符一起使用的两种方式有什么区别
    • 我不完全确定这两种方法都适合我。你能看到$CsvFiles.psstandardmembers.DefaultDisplayPropertySet.ReferencedPropertyNames 的结果是什么,其中$CsvFiles 使用Get-ChildItem "$ActivityLogDirectory" -Filter *.csv 填充?
    • 使用任一方式调用Get-ChildItem,然后调用$CsvFiles.psstandardmembers.DefaultDisplayPropertySet.ReferencedPropertyNames返回相同的结果LastWriteTimeLengthName
    • 奇怪,我现在得到相同的结果:What if: Performing the operation "Compress-Archive" on target " C:\test\New Microsoft Excel Workshee.csv C:\test\New Microsoft Excel Worksheet (2).csv". 当您使用第一种方法创建变量时,完整路径将被传递给Compress-Archive,而第二种方法只是传递姓名Compress-Archive : The path 'New Microsoft Excel Workshee.csv' either does not exist or is not a valid file system path
    猜你喜欢
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    相关资源
    最近更新 更多