Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 如何处理不同的路径分隔符?_Powershell_Powershell V6.0 - Fatal编程技术网

Powershell 如何处理不同的路径分隔符?

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

我想编写在所有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和平台,尽管与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上的
/