2014-12-17 2 views
5

Sto semplicemente cercando di creare uno script PowerShell che calcoli la somma md5 di un file eseguibile (un file).Non è possibile chiamare un metodo su un'espressione con valori null

Il mio script 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." 
} 

Su correre il mio script ricevo il seguente errore:

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 

Per la mia comprensione, questo errore significa che lo script sta tentando di fare qualcosa, ma un altro parte dello script non ha alcuna informazione per consentire il corretto funzionamento della prima parte dello script. In questo caso, $hash.

Get-ExecutionPolicy uscite Unrestricted.

Che cosa sta causando questo errore?
Che cosa è esattamente la mia espressione di valore nullo?

Qualsiasi aiuto è apprezzato. Mi scuso se questo è banale e continuerò la mia ricerca.


Riferimenti:

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

How to get an MD5 checksum in PowerShell

+2

Ciò che è '$ md5'? Quella variabile non è nel codice che mostri? Quello è nullo da quello che vedo – Matt

+1

Come mi sono perso, non lo so. Grazie Matt per la pronta risposta. Il mio codice ora funziona perfettamente dopo aver aggiunto il mio oggetto. '$ md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider' – Ben

+0

Possibile duplicato di [Non è possibile chiamare un metodo su un'espressione con valore null - generale] (http://stackoverflow.com/questions/31335195/you -cannot-call-a-method-on-a-null-valued-expression-general) –

risposta

10

La risposta più semplice per questo è che si dispone di una variabile non dichiarata (null). In questo caso è $md5. Dal commento di mettere questo doveva essere dichiarati altrove nel codice

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

L'errore è stato perché si sta cercando di eseguire un metodo che non esiste.

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, ... 

La .ComputeHash() del $md5.ComputeHash() era il valore nullo espressione. Digitando in parole senza senso creerebbe lo stesso effetto.

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 per impostazione predefinita consente di lavorare come definito la sua StrictMode

When Set-StrictMode is off, uninitialized variables (Version 1) are assumed to have a value of 0 (zero) or $Null, depending on type. References to non-existent properties return $Null, and the results of function syntax that is not valid vary with the error. Unnamed variables are not permitted.

+3

Devo amare il bagel! – Gareth