1. ホーム
  2. powershell

[解決済み] PowerShellでパスを正規化する方法は?

2022-11-10 14:33:15

質問

2つのパスがあります。

fred\frog

..\frag

こんな感じでPowerShellで結合できるんです。

join-path 'fred\frog' '..\frag'

その結果、こうなります。

fred\frog\..\frag

しかし、私はそれを望んでいません。私はこのように、二重のドットのない正規化されたパスが欲しいのです。

fred\frag

どうすればいいんだ?

どのように解決するのですか?

を組み合わせて使用することができます。 $pwd , Join-Path[System.IO.Path]::GetFullPath で、完全修飾された展開されたパスを取得します。

から cd ( Set-Location ) はプロセスの現在の作業ディレクトリを変更しません。PowerShell コンテキストを理解しない .NET API に相対ファイル名を渡すだけで、(現在の場所ではなく)最初の作業ディレクトリに基づくパスに解決するなど、意図しない副作用が発生する可能性があります。

あなたがすることは、まずあなたの道を修飾することです。

Join-Path (Join-Path $pwd fred\frog) '..\frag'

これは(私の現在地からすると)収穫です。

C:\WINDOWS\system32\fred\frog\..\frag

絶対ベースがあれば、.NET APIを安全に呼び出すことができます。 GetFullPath :

[System.IO.Path]::GetFullPath((Join-Path (Join-Path $pwd fred\frog) '..\frag'))

これは完全修飾パスを与えるもので、その中に .. が正しく解決された完全なパスが得られます。

C:\WINDOWS\system32\fred\frag

個人的には、外部スクリプトに依存するような解決策は嫌いです。 Join-Path$pwd ( GetFullPath はきれいにするためだけです)。もしあなたが のみを残したい場合は、相対的な部分である を残したいだけなら、単に .Substring($pwd.Path.Trim('\').Length + 1) を追加するだけで、出来上がりです。

fred\frag

最新情報

を指摘してくれた @Dangph に感謝します。 C:\ のエッジケースを指摘してくれたことに感謝します。