bugfix> powershell > 投稿

ファイルパスの可用性をテストするスクリプトを作成しようとしていました。プロセスの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"

回答 3 件
  • ドラッグアンドドロップの場合、パスにスペースがない場合はtrueを返します。スペースがある場合、PowerShellは引用符で囲みます。その場合、PowerShellは文字通りパスを "C:\Program Files\7-Zip\7z.exe" として認識しています

    あなたができることは、 -replace を使用することです  このような演算子-

    Test-Path -path ($filepath -replace '"', "") -PathType Leaf
    
    

    または

    @Josefzのコメントで示唆されているように、 Trim() も使用できます。  のような方法-

    Test-Path -path ($filepath.Trim('"')) -PathType Leaf
    
    

    問題の正確な説明ではありませんが、これを回避策として使用できます。

  • ユーザーが埋め込み " を含むファイル名を入力した場合  文字、次に 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
    
    

あなたの答え