1. ホーム
  2. powershell

[解決済み] PowerShellでパスが存在するかどうかを確認する良い方法 [終了しました]

2022-05-16 23:47:20

質問

PowerShell でパスが存在しないかどうかを確認する、より簡潔でエラーが発生しにくい方法はありますか?

これは、このような一般的な使用例としては、客観的にあまりに冗長です。

if (-not (Test-Path $path)) { ... }
if (!(Test-Path $path)) { ... }

これは多くの括弧を必要とし、"not exist"をチェックするときにあまり読みやすいものではありません。また、次のようなステートメントがあるため、エラーになりやすいのです。

if (-not $non_existent_path | Test-Path) { $true } else { $false }

は実際には False を返しますが、ユーザは True .

何か良い方法はないでしょうか?

更新1です。 私の現在の解決策は、エイリアスを使って existnot-exist を説明したように ここで .

アップデート2です。 これも修正される提案された構文は、以下の文法を許可することです。

if !(expr) { statements* }
if -not (expr) { statements* }

PowerShellリポジトリにある関連イシューはこちらです(vote upしてください)。 https://github.com/PowerShell/PowerShell/issues/1970

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

単にコマンドレット構文に代わるものが欲しいだけなら、特にファイルについては File.Exists() .NET メソッドを使用します。

if(![System.IO.File]::Exists($path)){
    # file with path $path doesn't exist
}


一方で、もし汎用の否定されたエイリアスを Test-Path の否定されたエイリアスが必要な場合、それを行う方法は以下の通りです。

# Gather command meta data from the original Cmdlet (in this case, Test-Path)
$TestPathCmd = Get-Command Test-Path
$TestPathCmdMetaData = New-Object System.Management.Automation.CommandMetadata $TestPathCmd

# Use the static ProxyCommand.GetParamBlock method to copy 
# Test-Path's param block and CmdletBinding attribute
$Binding = [System.Management.Automation.ProxyCommand]::GetCmdletBindingAttribute($TestPathCmdMetaData)
$Params  = [System.Management.Automation.ProxyCommand]::GetParamBlock($TestPathCmdMetaData)

# Create wrapper for the command that proxies the parameters to Test-Path 
# using @PSBoundParameters, and negates any output with -not
$WrappedCommand = { 
    try { -not (Test-Path @PSBoundParameters) } catch { throw $_ }
}

# define your new function using the details above
$Function:notexists = '{0}param({1}) {2}' -f $Binding,$Params,$WrappedCommand

notexists は、次のように動作します。 まさに のように Test-Path と同じですが、常に反対の結果を返します。

PS C:\> Test-Path -Path "C:\Windows"
True
PS C:\> notexists -Path "C:\Windows"
False
PS C:\> notexists "C:\Windows" # positional parameter binding exactly like Test-Path
False

あなたが既に示したように、その逆は非常に簡単で、単にエイリアス existsTest-Path :

PS C:\> New-Alias exists Test-Path
PS C:\> exists -Path "C:\Windows"
True