【问题标题】:Get-ChildItem Fails When Using a Variable With the Include Switch使用包含开关的变量时 Get-ChildItem 失败
【发布时间】:2014-08-15 17:24:13
【问题描述】:

Powershell v4.0 视窗 7

此代码有效并检索我要查找的 2 个文件:

$dir = Get-Item -Path "C:\TestSource"
Get-ChildItem -Path "$($dir.FullName)\*" -File -Include *.txt,*.inf

此代码也可以,但它只能找到 txt 文件:

$Dir = Get-Item -Path "C:\TestSource"
$Filter = "*.txt"
Get-ChildItem -Path "$($dir.FullName)\*" -File -Include $Filter

但是,这不会返回任何对象:

$Dir = Get-Item -Path "C:\TestSource"
$Filter = "*.txt,*.inf"
Get-ChildItem -Path "$($dir.FullName)\*" -File -Include $Filter

有必要将 $Filter 变量构建成这样的数组:

$Dir = Get-Item -Path "C:\TestSource"
$Filter = @("*.txt","*.inf")
Get-ChildItem -Path "$($dir.FullName)\*" -File -Include $Filter

Get-ChildItem 上的 Microsoft 页面让我相信可以通过 Get-ChildItem cmdlet 使用变量。但是,为什么 cmdlet 不返回对象,除非变量是数组?由于显式字符串在第一个示例中有效,第三个示例不应该也有效吗?

【问题讨论】:

    标签: windows variables powershell


    【解决方案1】:

    Include 的参数始终是一个数组 - 在您的第一个示例中,-Include *.txt,*.inf 传递一个二元素数组作为过滤器。

    在您的第三个示例中,它是一个逗号分隔的字符串。如果你传递一个数组,它应该可以工作:

    $Dir = Get-Item -Path "C:\TestSource"
    $Filter = "*.txt", "*.inf"
    Get-ChildItem -Path "$($dir.FullName)\*" -File -Include $Filter
    

    【讨论】:

    • 是的,我想通了.....但是我重新提出了我的问题(在您发布前 3 分钟)以找到询问原因。
    • 感谢您更新您的答案,这完全有道理。
    • 此外,Get-ChildItem 将 -Include 参数传递给文件系统提供程序,它本身并不实际处理这些参数。当它通过-Include *.txt,*.ini 时,powershell 会看到一个包含两个字符串的数组。当它被告知“.txt,.ini”时,它会看到一个 9 字符长的字符串,因此它将该字符串传递给提供者,然后它会查找包含字符串 "*.txt,*.ini" 的文件,但它永远不会找到。
    【解决方案2】:

    李给出了答案;在您的第三个示例中,您尝试为 -Include 参数传递多个值以进行评估,但您没有将其适当地格式化为数组,因此脚本正在寻找名称中包含整个字符串模式的文件:*.txt,*.inf

    【讨论】:

    • 您可能忘记了编辑时间。在我写第一条评论时,他还没有编辑他的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    相关资源
    最近更新 更多