[解決済み] 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です。
私の現在の解決策は、エイリアスを使って
exist
と
not-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
あなたが既に示したように、その逆は非常に簡単で、単にエイリアス
exists
を
Test-Path
:
PS C:\> New-Alias exists Test-Path
PS C:\> exists -Path "C:\Windows"
True
関連
-
powershellでSQL SERVERの全バージョンを弄る方法
-
ファイルサイズを一括で取得するPowershellコード
-
PowerShellでのmatchコマンドの使用方法について解説
-
PowerShellによるファイル名変更のバッチ処理例
-
PowerShellの条件付きパイプライン終了方法
-
[解決済み] Windows PowerShellでファイルが存在するかどうかをチェックする?
-
[解決済み] PowerShellでWindowsサービスが存在するかどうかを確認し、削除する
-
[解決済み] 現在のPowerShellスクリプトの場所を特定する最良の方法は何ですか?
-
[解決済み] PowerShellで文字列がNULLまたは空であるかどうかを確認するにはどうすればよいですか?
-
[解決済み】PowerShellでパスを再読み込みする。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン