ファイルパスの可用性をテストするスクリプトを作成しようとしていました。プロセスの1つは、ユーザーがファイルパスを入力するか、Powershellコマンドプロンプトにファイルをドラッグするだけです。
このプロセスでは、 ユーザーは次のようなファイルパスを入力しますC:\ Program Files \ 7-Zip \ 7z.exe 文字列は次の値になります$filePath Test-Pathコマンドのパラメーターとして使用される変数。
しかし、ユーザーはファイルをPowershellコマンドプロンプトにドラッグするだけで、文字列に図1のように引用符が含まれるようになります。 ( "C:\ Program Files \ 7-Zip \ 7z.exe") 写真1
次に、その$filePath変数でTest-Pathコマンドを使用してパスをテストしようとすると、$filePathのvalue(string)に次のペアが含まれていることがわかります。クォーテーションマーク、パスが既存で有効であっても、結果は常にFalseになります。 しかし、同じTest-Pathコマンドを使用すると変数を使用せずに (ファイルパスをコピーしてコマンドに貼り付けるだけです)、正常に動作します。
それは奇妙だ!
ファイルをPowershellコマンドプロンプトにドラッグする代わりに、キーボードでファイルパスを変数に入力してみました。 (引用符なし) 次に、同じ方法を使用してファイルパスをテストします(ファイルパスに変数を使用)。正常に動作します。
写真2
わかりません。彼らは同じものではありませんか?
いつ
$filePath = "C:\Program Files\7-Zip\7z.exe"
以下の2つのコマンドは同じ結果になるはずです!なぜそうではないのですか?
Test-Path -Path $filePath
Test-Path -Path "C:\Program Files\7-Zip\7z.exe"
ユーザーが埋め込み
"
を含むファイル名を入力した場合 文字、次にTest-Path
$false
を返します 。どうして?ファイル名に"
を含めることはできません キャラクター;"
文字は、文字列の引数に空白が含まれていることを示すためにパーサーによって使用されます。したがって、これはもちろん$false
を返します :$filePath = '"C:\Program Files\7-Zip\7z.exe"' Test-Path $filePath
埋め込まれた
"
文字はファイル名の一部ではありません。結果を$true
にするためにそれらを省略する必要があります 。どのバージョンのPowerShellを使用していますか?私は
true
を得る 両方のコマンド用PS C:\Users> $filePath = "C:\Program Files\7-Zip\7z.exe" PS C:\Users> Test-Path -Path $filePath True PS C:\Users> Test-Path -Path "C:\Program Files\7-Zip\7z.exe" True PS C:\Users> $PSVersionTable.PSVersion Major Minor Build Revision ----- ----- ----- -------- 5 1 17134 48
編集----------
問題は、Read-Hostが文字列を引用符付きでそのまま保存することです。簡単な解決策は、引用符を削除することです
PS C:\Users> $filePath = Read-Host -Prompt "enter input" enter input: "C:\Program Files\7-Zip\7z.exe" PS C:\Users> $filePath "C:\Program Files\7-Zip\7z.exe" PS C:\Users> Test-Path -Path $filePath False PS C:\Users> Test-Path -Path $filePath.replace("`"","") True
ドラッグアンドドロップの場合、パスにスペースがない場合はtrueを返します。スペースがある場合、PowerShellは引用符で囲みます。その場合、PowerShellは文字通りパスを
"C:\Program Files\7-Zip\7z.exe"
として認識していますあなたができることは、
-replace
を使用することです このような演算子-または
@Josefzのコメントで示唆されているように、
Trim()
も使用できます。 のような方法-問題の正確な説明ではありませんが、これを回避策として使用できます。