dea*_*dog 9 directory powershell get-childitem
举个简单的例子,假设我有一个文件夹Root,里面有三个文件夹; Folder1,Folder2和Folder3.这些文件夹(包括Root)中的每一个都包含一堆文件,包括.pdb文件.我想使用PowerShell Get-ChildItem cmdlet返回所有文件夹(包括Root)中的所有文件,但Folder2中的.pdb文件除外.如果我使用:
Get-ChildItem -Path C:\Root -Recurse -Exclude *.pdb
Run Code Online (Sandbox Code Playgroud)
然后我回到所有目录中的所有非.pdb文件,这接近我想要的.所以我假设以下内容将实现我想要的:
Get-ChildItem -Path C:\Root -Recurse -Exclude \*\\Folder2\\*.pdb
Run Code Online (Sandbox Code Playgroud)
但这并不排除Folder2(或任何其他文件夹)中的任何pdb文件.我已经为-Exclude过滤器尝试了几种变体,例如Folder2\\\*.pdb,但我无法让它工作.事实上,即使使用\*\\\*.pdb似乎也没有做任何事情; 没有.pdb文件从任何文件夹中排除.
所以似乎通配符不能用于目录,只能用于文件名,但我认为我只是做错了.我发现这篇文章解释了通配符和范围操作符,但不幸的是它没有讨论将它们与目录名一起使用; 只有文件名.
我还没有看到exclude参数使用目录.
你可以试试管道到Where-Object.那是,
Get-ChildItem -Recurse *.pdb | Where-Object {$_.FullName -notMatch "folder2"}
Run Code Online (Sandbox Code Playgroud)
OhadH 的答案已经差不多了。
您可以使用
Get-ChildItem -Recurse | Where-Object {$_.FullName -notmatch "folder2" -or $_.Name -notlike "*.pdb" }
Run Code Online (Sandbox Code Playgroud)
或者
Get-ChildItem -Recurse | ? {$_.FullName -notlike "*folder2*" -or $_.Name -notlike "*.pdb" }
Run Code Online (Sandbox Code Playgroud)
这取决于您的folder2 所在的位置。但我想你已经明白了。
我不想这么说,但 PowerShell 并不像Bash或其他 shell 那样方便。
小智 5
gci "C:\Root" -Recurse | Where-Object {$_.FullName -notlike "*Folder2\*.pdb*"} | Export-CSV "C:\Root\Export.csv" -NoType
Run Code Online (Sandbox Code Playgroud)
尝试,测试和一个衬垫:-)。这有效,因为我已经复制了您的文件夹和文件结构进行复制。然而,很抱歉它晚了几年。
显然,您可以根据自己的需要随意调整代码。