使用Get-Content过滤文件名

时间:2014-02-11 19:00:40

标签: powershell

编辑:

这似乎有效。希望它可以帮助某人:

Get-ChildItem C:\Users\$env:username\Desktop\RD | 
Where-Object {$_.Name -match "^[^8]*141.txt"} | 
Foreach-Object {$_ 
                Get-Content -Path C:\Users\$env:username\Desktop\RD\$_ | 
                Out-File C:\Users\$env:username\Desktop\RD\141Master.txt
               }

我正在尝试过滤文件名以获得更明确的附加过程。所以我可以这样做:

Get-Content C:\erik\*.txt | Out-File C:\erik\whatever.txt

并附加所有文本文件。然后我可以这样做:

Get-Content C:\erik\*101.txt | Out-File C:\erik\whatever.txt

其中包含101的所有文件都附加了。但是当我尝试这样的事情时:

Get-Content C:\erik\^[^8]*141.txt | Out-File C:\erik\whatever.txt

我明白了:

  

Get-Content:指定路径上的对象   C:\ Users \ edarling \ Desktop \ RD \ ^ [^ 8] * 141.txt不存在,或者已经存在   通过-Include或-Exclude参数进行过滤。在行:1个字符:1   + Get-Content C:\ Users \ edarling \ Desktop \ RD \ ^ [^ 8] * 141.txt | Out-File C:\ Users \ edarl ...   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~       + CategoryInfo:ObjectNotFound:(System.String []:String [])[Get-Content],异常       + FullyQualifiedErrorId:ItemNotFound,Microsoft.PowerShell.Commands.GetContentCommand

我一直在尝试将Get-ChildItem传递给Get-Content,但无法弄明白。有什么建议吗?

由于

1 个答案:

答案 0 :(得分:0)

Get-Content仅支持globbing,而非regular expressions。对于前者,你只能做这样的事情:

  • 匹配以141.txt结尾的所有文件名:*141.txt
  • 匹配以foo开头并以dt结尾的所有文件名:foo*[dt]
  • 匹配所有由两个任意字符组成的文件名,后跟扩展名.doc??.doc

Globbing不允许您形成表达式以匹配包含特定字符的名称。 Get-Content表达式^[^8]*141.txt表示“以插入符号开头,后跟另一个插入符号或字符8,以141.txt结尾”的文件名。

如果您需要按正则表达式过滤,则必须使用-match运算符:

Get-ChildItem 'C:\some\folder' | ? { $_.Name -match '^[^8]*141\.txt$' }

请注意,在正则表达式中,如果要匹配文字点(\.),则需要转义点。未换行的点匹配除换行符之外的任何字符。你还应该在两边锚定你的表达。否则,正则表达式^[^8]*141.txt不仅会与abc141.txt匹配,还会与141_txt.doc匹配。