5

$ fileNameが存在する場合、同等のコマンドレット[System.IO.Path]::GetFullPath($fileName);はです(Get-Item $fileName).FullName。ただし、パスが存在しない場合は例外がスローされます。私が見逃している別のコマンドレットはありますか?

Join-Path絶対パスが渡されると機能しないため、受け入れられません。

C:\Users\zippy\Documents\deleteme> join-path $pwd 'c:\config.sys'
C:\Users\zippy\Documents\deleteme\c:\config.sys
C:\Users\zippy\Documents\deleteme>
4

3 に答える 3

8

Join-Path存在しないアイテムのパスを取得する方法になると思います。このようなもの:

join-path $pwd $filename

アップデート:

.Net「コード」を使用したくない理由がわかりません。Powershell は .Net ベースです。すべてのコマンドレットは .Net コードです。それを回避する唯一の正当な理由は、.Net コードを使用する場合、現在のディレクトリは Powershell が開始されたディレクトリであり、そうではないことです。$pwd

絶対パスと相対パスを処理できるように、これを行うことができると私が信じている方法をリストしているだけです。それらのどれも 1 つより単純に見えませんGetFullPath():

$ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($filename)

絶対パスが渡されるかどうか心配な場合は、次のようにすることができます。

if(Split-Path $filename -IsAbsolute){
    $filename
}
else{
    join-path $pwd $filename  # or join-path $pwd (Split-Path -Leaf $filename)
}

これは醜いものです

 $item = Get-Item $filename -ea silentlycontinue
 if (!$item) {
 $error[0].targetobject
 } else{
 $item.fullname
 }

同様の質問と同様の回答: Powershell: resolve path that might not exist?

于 2011-08-24T00:15:34.823 に答える
1

フルネームを取得する前に、Test-Path コマンドレットを使用して存在を確認できます。

if (Test-Path $filename) {(Get-Item $fileName).FullName}

編集:

Test-Path が [system.io.file]::exists() 関数と同等であるという上記のコメントを見たところ、あなたの質問をよりよく理解できると思います。

私が見る限り、答えはノーですが、自分で作成することもできます。

function Get-Fullname {
  param($filename)
  process{
      if (Test-Path $filename) {(Get-Item $fileName).FullName} 
  }
}

パラメータがパイプライン、文字列とプロパティの両方を受け入れるようにすることで、ある程度整理できますが、それは目的を果たします。

于 2011-08-24T06:09:34.700 に答える
-1

「c:\config.sys」のドライブ修飾子を削除して (Split-Path を使用)、2 つのパスを結合できます。

PS > Join-Path $pwd (Split-Path 'c:\config.sys' -NoQualifier)    
C:\Users\zippy\Documents\deleteme\config.sys
于 2011-08-24T08:07:28.020 に答える