如何处理不同的路径分隔符?
How are differing path separators handled?
我想在所有 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 }
我建议将处理目录分隔符的责任转移到底层 .Net 平台。像这样:
Get-ChildItem -Recurse |
Where-Object { $_.FullName.Split([IO.Path]::DirectorySeparatorChar) -notcontains "obj" } |
ForEach-Object { $_.FullName }
从至少 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
我想在所有 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 }
我建议将处理目录分隔符的责任转移到底层 .Net 平台。像这样:
Get-ChildItem -Recurse |
Where-Object { $_.FullName.Split([IO.Path]::DirectorySeparatorChar) -notcontains "obj" } |
ForEach-Object { $_.FullName }
从至少 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