如果文件的MD5哈希值发生变化,我试图替换某个.jar文件。我编写了一个小的PowerShell脚本来对文件进行散列,而.ps1脚本则通过批处理文件运行。
PowerShell将哈希值打印到1.txt
后,我希望批处理脚本检查文本文件中是否有正确的哈希值,如果哈希值不同,则会用旧版本覆盖该文件。该文件的替换尚未实现,但会在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
的内容:
SHA1 hash of file license.jar: ff b1 b9 2d b1 03 db 59 3f 9e ca 51 f0 14 67 62 ca a8 d7 7d CertUtil: -hashfile command completed successfully.
错误级别始终为1,即使该字符串与文本文件中的字符串相同。也许我使用错误的论点?
我在Out-File
中使用powershellmd5.ps1
来撰写结果:
certutil -hashfile license.txt | Out-File 1.txt
答案 0 :(得分:3)
显然,您正在使用Out-File
来创建1.txt
。该cmdlet使用Unicode(little endian UTF-16)作为默认编码,findstr
不支持。该命令将文件处理为ASCII¹文本,因此无法找到匹配项。
有两种方法可以解决这个问题:
使用ASCII编码编写1.txt
,方法是使用Out-File
参数调用-Encoding
:
certutil -hashfile license.txt | Out-File 1.txt -Encoding Ascii
或通过调用Set-Content
(默认为ASCII编码):
certutil -hashfile license.txt | Set-Content 1.txt
使用find
命令(supports 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
,所以现在让我们坚持使用该名称以避免混淆。
答案 1 :(得分:1)
根据此问题中发表的评论,我认为对此主题存在一些误解,我试图澄清。
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的文件所需的时间少得多。
答案 2 :(得分:0)
我使用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并打印相同的"