【问题标题】:How are differing path separators handled?如何处理不同的路径分隔符?
【发布时间】: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


【解决方案1】:

我建议将处理目录分隔符的责任转移到底层 .Net 平台。像这样的:

Get-ChildItem -Recurse |
Where-Object { $_.FullName.Split([IO.Path]::DirectorySeparatorChar) -notcontains "obj" } |
ForEach-Object { $_.FullName }

【讨论】:

  • 这行得通。我仍然愿意接受更好/更简单的事情。
  • 所以,[IO.Path]::DirectorySeparatorChar 就像 Python 的 os.path.sep。如果这是在Env:pathsepVariable:pathsep 或类似的东西中自动创建的。
  • @TessellatingHeckler - 在 Linux 上这两个都是 /
【解决方案2】:

至少从PowerShell v6.0.0-beta.2 $PSVersionTable 开始,您可以使用其他属性 GitCommitId、OS 和 Platform 在您的代码中进行区分,尽管最好只有一个版本,如 Mikhails 的答案。

$PSVersionTable                                                                                                                  

Name                           Value                                                                                               
----                           -----                                                                                               
PSVersion                      6.0.0-beta                                                                                          
PSEdition                      Core                                                                                                
BuildVersion                   3.0.0.0                                                                                             
CLRVersion                                                                                                                         
GitCommitId                    v6.0.0-beta.2                                                                                       
OS                             Linux 4.4.0-78-generic #99-Ubuntu SMP Thu Apr 27 15:29:09 UTC 2017                                  
Platform                       Unix                                                                                                
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}                                                                             
PSRemotingProtocolVersion      2.3                                                                                                 
SerializationVersion           1.1.0.1                                                                                             
WSManStackVersion              3.0  

【讨论】:

    猜你喜欢
    • 2015-06-19
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    相关资源
    最近更新 更多