まず、.NETフレームワークを使用して回避策:
[IO.Path]::Combine('a', 'b', 'c')
これは、Windows上でUnix上a/b/c
、そしてa\b\c
もたらし、そして便利なパスコンポーネントの任意のの数をサポートしています。
注:Join-Path
はどのPowerShellドライブプロバイダのパスで動作するように設計されたのに対し、
この回避策は、唯一ファイルシステムパスのためです。
のいずれかの成分が無視されているため、\
(Windows)または/
と最初開始以外のコンポーネント(UNIX)ことを確認してください。たとえば、Windowsの場合:
[IO.Path]::Combine('\a', '\b', 'c') # -> '\b\c' - '\a' is ignored(!)
Join-Path
はではありません。はこの現象を示します。詳細はthis answer私のを参照してください。パイプラインとシークエンシングに代替Join-Path
呼び出しとして
することができます単に使用(...)
(部分式):
Join-Path a (Join-Path b c) # -> 'a\b\c' (on Windows)
私はための説明なしを持っています行動の違い; Join-Path -?
で表示される構文はWindows PowerShellのv5.1.14393.693
とPowerShellのコアv6.0.0-alpha.14
(偶発的パラメータは省略)のように、両方のプラットフォームで同じです。この構文に基づいて
Join-Path [-Path] <String[]> [-ChildPath] <String> ...
、呼び出しJoin-Path a b c
がなるはずです構文エラーにあります。これは実際にはWindows(A positional parameter cannot be found that accepts argument 'c'
)で起こりますが、Unixプラットフォームでは起こりません。 [1]
をJoin-Path
があまりにもパスコンポーネント、そしてそれは、既にWindows PowerShellでの今後の変化におそらくPowerShellのコアでポイントを働くという事実の任意の数で働いていた場合が、それは確かに便利だろう、と述べたこと。 [-Path] <String[]>
がアレイパラメータであっても、その目的は、単一の出力経路の複数の子パス成分を受け入れるが、複数親子経路対の接合可能ではないこと
注意。例えば:それはおそらく賢明ではないにもかかわら
$ Join-Path a,b c # same as: Join-Path -Path a,b -ChildPath c
a\c
b\c
は最後に、あなたは、多くの場合、多くのWindows API関数のためだけでなく、ハードコーディング/
両方プラットフォーム上のパスの区切りとしてで逃げることができますPowerShellの独自のコマンドレットは\
と/
を同義語として受け入れるので、。
しかし、すべてのユーティリティがこのように動作するわけではないので、プラットフォームに適したセパレータを使用するのが一般的に安全です。例えば
、Windows上だけで罰金以下の作品:
Get-Item c:/windows/system32 # same as: Get-Item c:\windows\system32
[1]厳密に言えば、それはプラットフォームが、PowerShellの版についてではありません。Join-Path a b c
作品にマルチプラットフォームのPowerShellコアエディション(Windowsの場合でも) - WindowsネイティブではなくWindows PowerShellエディションv5.1以降)。つまり、PowerShellコアは通常、Unixプラットフォームでのみ使用されます。
私の知る限り、Join-Pathは2つのパスしか取ることができません。別のジョインにパイプを張ったり、.Netの '[io.path] :: combine()'メソッドを使って、私が知っている2つの回避策です。 – BenH