2017-06-15 13 views
2

すべてのPowerShellプラットフォームで動作するコードを記述したいと思います。次のコードは、Windowsでは\のパス区切り文字を使用し、Linuxではパス区切り文字として/を出力します。異なるパス区切りはどのように処理されますか?

Get-ChildItem -File -Recurse | ForEach-Object { $_.FullName } 

objディレクトリの下にあるファイルは除外します。 objディレクトリの数と深さはわかりません。これを行う1つの方法は、以下のようなものを使用してフィルタリングすることです。ただし、パス区切り記号が異なるため、これは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

フォルダの階層の深さを知っていたならば、あなたは – BenH

+0

@BenH -leaf' '分割経路の出力に基づいてフィルタリングでき - 一つの方法だろう。 '-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からは、あなたが好ましく、Mikhailsの答えのように1つのバージョンのみを持つにもかかわらず、あなたのコード内で区別するために使用できる追加のプロパティGitCommitId、OSやプラットフォームを持っています。

$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 
関連する問題