我想要replace某个.jar文件,如果该文件的MD5哈希值更改。 我已经编写了一个小的PowerShell脚本来完成文件的散列操作,并且.ps1脚本通过batch file运行。
PowerShell打印哈希到1.txt
我希望批处理脚本检查文本文件的正确散列,如果哈希是不同的,它会覆盖旧版本的文件。 文件的replace还没有实现,但一旦findstr
问题解决了。
@echo off setlocal EnableDelayedExpansion :a powershell.exe -ExecutionPolicy ByPass -file powershellmd5.ps1 findstr /c:"ff b1 b9 2d b1 03 db 59 3f 9e ca 51 f0 14 67 62 ca a8 d7 7d" "1.txt" echo !errorlevel! timeout /t 10 /NOBREAK goto a
哈希完成时,以下是1.txt
的内容:
文件license.jar的SHA1哈希值: ff b1 b9 2d b1 03 db 59 3f 9e ca 51 f0 14 67 62 ca a8 d7 7d CertUtil:-hashfile命令已成功完成。
错误级别始终为1,即使该string与文本文件中的string相同。 也许我使用的是错误的参数?
我在powershellmd5.ps1
使用Out-File
来写出结果:
certutil -hashfile license.txt | Out-File 1.txt
显然你正在使用Out-File
创建1.txt
。 该cmdlet使用Unicode(小端UTF-16)作为缺省编码, findstr
不支持。 该命令将文件处理为ASCII 1文本,因此无法找到匹配项。
有两种方法可以解决这个问题:
使用ASCII编码写入1.txt
,或者使用-Encoding
参数调用Out-File
:
certutil -hashfile license.txt | Out-File 1.txt -Encoding Ascii
或者通过调用Set-Content
(默认为ASCII编码):
certutil -hashfile license.txt | Set-Content 1.txt
使用find
命令(它支持Unicode )而不是findstr
:
find "ff b1 b9 2d b1 03 db 59 3f 9e ca 51 f0 14 67 62 ca a8 d7 7d" 1.txt
¹是的,我知道,它实际上是一个ANSI编码,但参数参数被命名为Ascii
,所以我们暂且坚持使用这个名称以避免混淆。
根据这个问题发表的意见,我认为这个话题有一些误解,我试图澄清。
Windows中包含的所有基于命令行的应用程序主要用于处理cmd.exe和批处理文件。 事实上,PowerShell的功能之一就是它可以像cmd.exe一样使用命令行应用程序。 没有一个基于命令行的应用程序设计用于PowerShell,但不能用于cmd.exe / Batch文件。
在我看来,在这个主题中使用PowerShell不仅是不必要的,而且也是原始问题的原因。 下面的纯批处理文件代码应该按照最初的意图运行,没有问题:
@echo off setlocal EnableDelayedExpansion :a certutil -hashfile license.jar > "1.txt" findstr /c:"ff b1 b9 2d b1 03 db 59 3f 9e ca 51 f0 14 67 62 ca a8 d7 7d" "1.txt" echo !errorlevel! timeout /t 10 /NOBREAK goto a
另外一点,运行这个纯批处理文件所需的时间要比运行基于PowerShell的时间要少得多。
我使用FC(filecompare)而不是使用findstr。 我让PowerShell创建1.txt,然后我将内容复制到2.txt,并将其保存为unicode。
由powershell生成的文件中的空格似乎不是常规的空格,并使用/ W来压缩空白和/ U解析文件作为Unicode是必要的,以使其工作。
现在的代码如下:
@echo off setlocal EnableDelayedExpansion :a powershell.exe -ExecutionPolicy ByPass -file powershellmd5.ps1 timeout /t 3 /NOBREAK fc /U /W /lb3 1.txt 2.txt IF NOT ERRORLEVEL 1 ( echo Indentical. ) else ( echo Different. ) pause del /q 1.txt timeout /t 10 /NOBREAK goto a
该脚本现在成功地比较这两个文件,返回错误代码0并打印Identical“