1. ホーム
  2. powershell

[解決済み] ヌル値の式でメソッドを呼び出すことはできない

2022-02-26 20:15:57

質問

私は、実行ファイル(ファイル)のmd5の合計を計算するpowershellスクリプトを作成しようとしているだけです。

私の.ps1スクリプトです。

$answer = Read-Host "File name and extension (ie; file.exe)"
$someFilePath = "C:\Users\xxx\Downloads\$answer"

If (Test-Path $someFilePath){
                        $stream = [System.IO.File]::Open("$someFilePath",[System.IO.Filemode]::Open, [System.IO.FileAccess]::Read)
                        $hash = [System.BitConverter]::ToString($md5.ComputeHash($stream))
                        $hash
                        $stream.Close()
                        }
Else{
Write-Host "Sorry, file $answer doesn't seem to exist."
}

スクリプトを実行すると、以下のエラーが表示されます。

You cannot call a method on a null-valued expression.
At C:\Users\xxx\Downloads\md5sum.ps1:6 char:29
+                             $hash = [System.BitConverter]::ToString($md5.Compute ...
+                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

私の理解では、このエラーは、スクリプトが何かを行おうとしているが、スクリプトの別の部分が、スクリプトの最初の部分が適切に動作するための情報を持っていないことを意味します。この場合 $hash .

Get-ExecutionPolicy 出力 Unrestricted .

このエラーの原因は何ですか?
私のNULL値式は一体何なのでしょうか?

どんなことでもご相談ください。些細なことでしたら申し訳ございませんが、引き続き調査させていただきます。


参考文献

http://blogs.technet.com/b/heyscriptingguy/archive/2013/03/27/troubleshoot-the-invokemethodonnull-error-with-powershell.aspx

PowerShellでMD5チェックサムを取得する方法

解決方法は?

簡単な答えは、宣言されていない(NULL)変数があることです。この場合、それは $md5 . あなたが書いたコメントから、これはあなたのコードの別の場所で宣言される必要があります。

$md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider

存在しないメソッドを実行しようとしているため、エラーが発生しました。

PS C:\Users\Matt> $md5 | gm


   TypeName: System.Security.Cryptography.MD5CryptoServiceProvider

Name                       MemberType Definition                                                                                                                            
----                       ---------- ----------                                                                                                                            
Clear                      Method     void Clear()                                                                                                                          
ComputeHash                Method     byte[] ComputeHash(System.IO.Stream inputStream), byte[] ComputeHash(byte[] buffer), byte[] ComputeHash(byte[] buffer, int offset, ...

.ComputeHash()$md5.ComputeHash() はNULL値式でした。意味不明な文字を入力しても、同じ効果が得られます。

PS C:\Users\Matt> $bagel.MakeMeABagel()
You cannot call a method on a null-valued expression.
At line:1 char:1
+ $bagel.MakeMeABagel()
+ ~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull


PowerShellはデフォルトで、次のように定義されているようにこれを可能にします。 ストリクトモード

<ブロッククオート

いつ 設定-StrictMode がオフの場合、初期化されていない変数 (バージョン 1) は、型によって 0 (ゼロ) または $Null の値を持つものと見なされます。存在しないプロパティへの参照は$Nullを返し、有効でない関数構文の結果は、エラーによって異なります。名前のない変数は許可されません。