3

我想编写在所有 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 }
4

2 回答 2

2

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

Get-ChildItem -Recurse |
Where-Object { $_.FullName.Split([IO.Path]::DirectorySeparatorChar) -notcontains "obj" } |
ForEach-Object { $_.FullName }
于 2017-06-15T16:33:42.523 回答
0

至少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  
于 2017-06-15T17:30:30.487 回答