Vous ne pouvez pas appeler une méthode sur une expression de valeur nulle

j'essaie simplement de créer un script powershell qui calcule la somme md5 d'un exécutable (un fichier).

Mon .ps1 script:

$answer = Read-Host "File name and extension (ie; file.exe)"
$someFilePath = "C:UsersxxxDownloads$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."
}

Lors de l'exécution de mon script j'ai l'erreur suivante:

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

à ma connaissance, cette erreur signifie que le script tente de faire quelque chose, mais une autre partie du script n'a aucune information permettant à la première partie du script de fonctionner correctement. Dans ce cas, $hash.

Get-ExecutionPolicy sorties Unrestricted.

Quelle est la cause de cette erreur?

Quel est exactement mon null expression de valeur?

Toute aide est appréciée. Je m'excuse si c'est insignifiant et je vais poursuivre mes recherches.


Références:

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

Comment obtenir un checksum MD5 en PowerShell

8
demandé sur Community 2014-12-17 15:02:02

1 réponses

la réponse simple pour celle-ci est que vous avez une variable non déclarée (nulle). Dans ce cas, il est $md5. Du commentaire que vous avez mis cela devait être déclaré ailleurs dans votre code

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

L'erreur est parce que vous tentez d'exécuter une méthode qui n'existe pas.

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() était l'expression de valeur nulle. Taper du charabia créerait le même effet.

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 by la valeur par défaut permet à ceci d'arriver comme défini son StrictMode

Quand Set-StrictMode est désactivé, les variables non initialisées (Version 1) sont supposés avoir une valeur de 0 (zéro) ou $Null, selon le type. Les références aux propriétés inexistantes retournent $ Null, et les résultats de la syntaxe de la fonction qui n'est pas valide varient avec l'erreur. Les variables sans nom ne sont pas autorisées.

12
répondu Matt 2018-01-18 16:47:50