我只是想创建一个PowerShell脚本来计算可执行文件(文件)的md5总和。
我的.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值表达式究竟是什么?
感谢任何帮助。如果这是微不足道的,我会道歉并继续我的研究。
参考文献:
答案 0 :(得分:14)
这个的简单答案是你有一个未声明的(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()
的{{1}}是空值表达式。输入乱码会产生同样的效果。
$md5.ComputeHash()
默认情况下,PowerShell允许按照StrictMode
的定义进行此操作当 Set-StrictMode 关闭时,假定未初始化的变量(版本1)的值为0(零)或$ Null,具体取决于类型。对不存在的属性的引用返回$ Null,并且无效的函数语法结果随错误而变化。不允许使用未命名的变量。