Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 如何仅显示双扩展名文件而不是所有文件?_Powershell - Fatal编程技术网

Powershell 如何仅显示双扩展名文件而不是所有文件?

Powershell 如何仅显示双扩展名文件而不是所有文件?,powershell,Powershell,我正在尝试运行一个脚本,该脚本将显示具有双扩展名的文件,但问题是它显示所有文件,而不仅仅是具有双扩展名的文件。有没有办法做到这一点 以下是我所拥有的: Get-ChildItem -Path C:\Users\User\Downloads -filter *.txt.* -Recurse 这将显示所有的txt文件以及带有额外的.txt(test.txt.txt)的文件,所以我尝试只显示双txt扩展名 希望我已经解释清楚了 感谢寻找官方文档,因为MSDN上没有关于Get ChildItem的具体

我正在尝试运行一个脚本,该脚本将显示具有双扩展名的文件,但问题是它显示所有文件,而不仅仅是具有双扩展名的文件。有没有办法做到这一点

以下是我所拥有的:

Get-ChildItem -Path C:\Users\User\Downloads -filter *.txt.* -Recurse
这将显示所有的txt文件以及带有额外的.txt(test.txt.txt)的文件,所以我尝试只显示双txt扩展名

希望我已经解释清楚了


感谢寻找官方文档,因为MSDN上没有关于
Get ChildItem
的具体内容。如果你把它放在路径中,你会得到你想要的结果

Get-ChildItem -Path "C:\Users\User\Downloads\*.txt.*"
这可能比
-Filter
要慢,但它会得到您想要的东西,并且可以递归地工作(在PowerShell v3.0+中)。不过,这只适用于txt文件。如果您想归档所有加倍/重复的扩展名文件,可以使用
where
子句对
Get ChildItem
进行后期处理

Get-ChildItem -Path "C:\Users\User\Downloads" -Recurse -File | 
    Where-Object{$_.Extension -and $_.BaseName -match "$([regex]::Escape($_.Extension))$"} 
该子句与以下文件匹配:

  • 分机
  • 名称(不带扩展名)的末尾具有相同的扩展名<代码>$\扩展名将返回“.txt”例如
    -match
    支持正则表达式,因此我们需要避开该周期以确保没有误报
    -File
    参数绝对是PS v3.0的一部分。这将返回在其全名末尾具有双扩展名的所有文件。PowerShell不会将尾随的
    $
    解释为任何特殊字符,因为它后面没有任何可能会混淆为变量的字符。您可以转义“$”,但这只是为了提醒您美元符号的用途。在本例中,反勾号的存在不会改变结果

    文件实际上没有双扩展名,它们只有一个扩展名,而文件名中有点。e、 g.
    block ten-building report.txt中的公寓1.04将作为block ten-building report.txt中名为.04的双扩展名出现在您的报告中

    因此:


    将获取所有文件和filter.txt扩展名以及带有点的名称。

    使用
    -Include
    而不是
    -filter
    ,这使通配符模式按预期工作:

    Get-ChildItem -Path C:\Users\User\Downloads -Recurse -Include *.txt.*
    
    注意:这与文件名中任何位置具有
    .txt.
    的文件相匹配,包括
    foo.txt.csv
    或“三重扩展名”文件,如
    foo.txt.txt

    *.txt.txt
    将只生成以
    .txt.txt
    结尾的文件名,该文件名仍将包含三个或更多扩展名
    .txt

    请注意,
    *.txt.txt
    也可以与
    -Filter
    一起使用

    虽然
    -Filter
    参数有一个主要的优点-它使底层文件系统提供程序在源代码处执行过滤,从而使其更快-它有限制和陷阱

    • 通配符模式语言比PowerShell自己的语言更为有限,有一些遗留的怪癖-请参阅以获取背景信息

      • 本质上,只支持
        *
        (不支持字符集/范围表达式,如
        [0-9]
        ),并且模式末尾的
        *
        或仅
        也匹配空字符串(这是您所经历的)
      • 在Windows PowerShell中(在PowerShell[Core]6+中不再是问题),也会意外地对通常隐藏的短(8.3)文件名执行匹配,这意味着类似
        *.xls
        的内容意外地表现为类似
        *.xls*
        的行为,并且还匹配
        .xlsx
        文件
    • 您只能将一个通配符模式传递给
      -Filter
      ,而
      -Include
      支持多个通配符模式


    另一方面,
    -Include
    -Exclude
    也有它们的怪癖。这里,
    -Include
    由于
    -Recurse
    而按预期工作如果没有
    -Recurse
    ,则必须使
    -Path
    值以
    \*
    结尾,才能使其工作
    -请参阅

    或者,如果您只需要一个通配符模式,您可以直接将该模式附加到路径-
    C:\Users\User\Downloads\*.txt.
    ,如中所示。
    但是,需要注意的是,对于
    -Recurse
    ,这只适用于PSv3或更高版本
    相比之下,PSv2仅将模式应用于直接子代


    在一个相关但不同的注释中,当指定以
    字符结尾的文本路径时,发现了一个奇怪之处。(至少从PSv2开始出现,直到PSv5.1为止):

    请注意(a)
    cmd.exe
    如何仍然匹配,尽管后面有多余的
    字符,
    .Name
    属性反映了这些
    字符。-即使
    .Extension
    .FullName
    都没有


    已报告此问题,但由于原因是基础
    GetFileAttributes
    本机Windows API函数的旧版绑定行为,因此此问题将无法在PowerShell中解决。

    感谢您提出的链接问题。那是我永远找不到的。我从来没想到在这里找过。@Matt:很高兴听到它有帮助;不幸的是,对于这个主题,作者三缄其口,没有附加信息的链接:“过滤器的语法,包括通配符的使用,取决于提供者。”
    Get-ChildItem -Path C:\Users\User\Downloads -Recurse -Include *.txt.*
    
    PS> Get-Item -LiteralPath c:\windows\system32\cmd.exe... | Format-List Name, Extension
    
    Name      : cmd.exe...
    Extension : .exe