2017-06-15 45 views
2

我想編寫在所有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 } 
+1

如果知道該文件夾的層深度,您可以過濾對'分離路徑-leaf' – BenH

+0

@BenH的輸出 - 這將是一個辦法。使用'-split'和'-in'可能會起作用,但是對於如此簡單的事情來說,這看起來像很多代碼。我已經更新了這個問題,以指定'obj'目錄的數量和深度是未知的。 – lit

+0

'Where-Object {$ _。FullName.split('/ \')-notcontains「obj」}'似乎確實有效。 – BenH

回答

2

我建議將處理目錄分隔符的職責轉移到底層的.Net平臺。事情是這樣的:

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

這工作。我仍然願意更好/更容易。 – lit

+0

因此,'[IO.Path] :: DirectorySeparatorChar'就像Python的'os.path.sep'。這是否會自動在'Env:pathsep'或'Variable:pathsep'或類似的東西中創建。 – lit

+0

別忘了['[System.IO.Path] :: AltDirectorySeparatorChar'](https://msdn.microsoft.com/en-us/library/system.io.path.altdirectoryseparatorchar%28v=vs.110% 29.aspx?f = 255&MSPPError = -2147217396)以及 – TessellatingHeckler

0

至少從PowerShell v6.0.0-beta.2 $ PSVersionTable具有附加屬性GitCommitId,操作系統和平臺,你可以在代碼中使用區分儘管只有一個版本,在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 
相關問題