Findstr始终无法在文本文件中找到哈希字符串

时间:2016-02-10 11:28:26

标签: windows powershell batch-file findstr

如果文件的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

3 个答案:

答案 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并打印相同的"