2016-02-10 7 views
0

Я пытаюсь заменить определенный файл .jar, если изменяется хэш файла MD5. Я написал небольшой скрипт PowerShell для хэширования файла, а скрипт .ps1 запускается через пакетный файл.Findstr всегда не находит хэш-строку в текстовом файле

После того, как 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

Он работает из командной строки, правильный синтаксис findstr и возвращает 0 для образца файла, который вы предоставили. Если путь был неправильным, вы увидите сообщение об ошибке. Попробуйте вставить 'pause' после вызова powershell, подождите несколько секунд, а затем посмотрите, работает ли findstr –

+0

. Есть ли вероятность, что разделители чисел в файле« 1.txt »_not_ будут пробелами (Ascii 32 chars)? – Aacini

+0

@Aacini Я посмотрю, что это может быть так. – xnstad

ответ

0

Вместо использования Findstr я использовал FC (filecompare). Я позволяю 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 и печатает Идентичные»

3

Видимо вы используете Out-File для создания 1.txt Командлет. использует Unicode (little endian UTF-16) в качестве кодировки по умолчанию, которую findstr не поддерживает. Команда обрабатывает файл как текст ASCII¹ и, следовательно, не может найти соответствия.

повторно двух путей решения этой проблемы:

  • Запись 1.txt с использованием кодировки ASCII, либо вызовом 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, так что давайте придерживаться с этим именем сейчас, чтобы избежать путаницы ,

+0

Хотя в этом случае было бы неразумно, обратите внимание, что вы можете обрабатывать ASCII-текст в файлах UTF-16 с помощью 'findstr', используя режим регулярных выражений и помещая точку между ними character: 'findstr/R/c:" ff .b.1.' и т. д. (Конечно, это допускает ложные срабатывания, если текст не ASCII, но иногда это полезно). –

1

В соответствии с комментариями, опубликованными в этом вопросе, я думаю, что есть некоторые заблуждения по этой теме, которые я пытаюсь прояснить.

Все приложения на основе командной строки, включенные в Windows, являются в основном, предназначенные для работы с cmd.exe и пакетными файлами. По сути, одна из особенностей PowerShell заключается в том, что он «может использовать приложения командной строки так же, как и cmd.exe». Существует не одно приложение на основе командной строки, предназначенное для работы с PowerShell, но не с cmd.exe/Batch-файлом.

По моему скромному мнению, использование PowerShell в этой теме не просто не нужно, но и является причиной исходной проблемы. Чистый код Batch-файл ниже должен работать, как первоначально предполагалось, без проблем:

@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 на основе одного.

+0

Прошу прощения. это решение? Меня очень интересует результат, потому что, на мой взгляд, это очень яркий пример ошибки, введенной PowerShell в коде, который в противном случае правильно запускался бы как чистый пакетный файл. – Aacini

+0

Да, я думаю то же самое. Это означает, что вы не должны пытаться заменить решение Batch-файла на «аналогичную» PowerShell, если вы не знаете обо всех сложностях PoSh, которые более сложны, чем пакетные файлы! – Aacini

 Смежные вопросы

  • Нет связанных вопросов^_^