Powershell 如何处理不同的路径分隔符?
我想编写在所有PowerShell平台上运行的代码。下面的代码使用Windows上的路径分隔符和Linux上的路径分隔符生成输出Powershell 如何处理不同的路径分隔符?,powershell,powershell-v6.0,Powershell,Powershell V6.0,我想编写在所有PowerShell平台上运行的代码。下面的代码使用Windows上的路径分隔符和Linux上的路径分隔符生成输出 Get-ChildItem -File -Recurse | ForEach-Object { $_.FullName } 我想排除obj目录下任何位置的文件。obj目录的数量和深度未知。这样做的一种方法是使用以下方法过滤掉那些人。但是,这在Linux上不起作用,因为路径分隔符是不同的 Get-ChildItem -File -Recurse | Wher
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和平台,尽管与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
如果您知道文件夹的级别深度,可以对
分割路径-leaf
@BenH-的输出进行过滤,这是一种方法。使用-split
和-in
可能会奏效,但对于如此简单的事情来说,这似乎需要很多代码。我已经更新了问题,以指定obj
目录的数量和深度未知。其中对象{$\ FullName.split('/\')-notcontains“obj”}
似乎可以工作。这也是一个好主意。但是,在Linux上,`\`字符可以是文件名的合法部分。基于这一点,这一点和我的建议都可能失败。我还在找更好的。这很有效。我仍然对更好/更简单的东西持开放态度。因此,[IO.Path]::directorysepartorchar
就像Python的os.Path.sep
。如果这是在Env:pathsep
或Variable:pathsep
或类似内容中自动创建的,请不要忘记well@TessellatingHeckler-这两个都是Linux上的/
。