【发布时间】:2017-12-03 05:53:36
【问题描述】:
我想编写可在所有 PowerShell 平台上运行的代码。以下代码在 Windows 上使用 \ 路径分隔符和在 Linux 上使用 / 路径分隔符生成输出。
Get-ChildItem -File -Recurse | ForEach-Object { $_.FullName }
我想排除obj 目录下任何位置的文件。 obj 目录的数量和深度未知。一种方法是使用以下内容过滤掉那些。但是,这在 Linux 上不起作用,因为路径分隔符不同。
Get-ChildItem -File -Recurse |
Where-Object { -not ($_.FullName -like '*\obj\*' |
ForEach-Object { $_.FullName }
使用正则表达式模式似乎可行,但我想知道是否有更清晰的方法来做到这一点。我觉得这很尴尬。不仅如此,\\ 字符作为 Linux 文件名的一部分是有效的,这可能会导致此代码存在故障漏洞。
Get-ChildItem -Recurse |
Where-Object { -not ( $_.FullName -like "*[/\]obj[/\]*") } |
ForEach-Object { $_.FullName }
【问题讨论】:
-
如果你知道文件夹的层级深度,你可以过滤
Split-Path -leaf的输出 -
@BenH - 这是一种方式。使用
-split和-in可能会起作用,但对于如此简单的事情来说,这似乎需要很多代码。我已更新问题以指定obj目录的数量和深度未知。 -
Where-Object {$_.FullName.split('/\') -notcontains "obj" }看起来确实可行。 -
这也是个好主意。但是,`\` 字符可以是 Linux 上文件名的合法部分。这和我的建议都可能基于此而失败。我仍在寻找更好的东西。
标签: powershell powershell-v6.0