#windows #batch-file
#Windows #пакетный файл
Вопрос:
Привет, я выполняю эту bat в среде Windows
for /f "usebackq" %%i in (hostname) DO SET host=%%i
for /R c:Users %%G IN (*.jpg) DO (
echo %host% >> output.txt
certutil -hashfile "%%G" MD5)
И я получаю этот вывод
Hostame
Hahs MD5 of the file <file> is
<hash>
CertUtil: -hashfile command executed
Мне нужна помощь, чтобы я мог отформатировать вывод следующим образом:
<hostname>,,<File>,,<hash>
Комментарии:
1. Итак, сделайте то, что вы делаете с помощью команды FOR при захвате выходных данных имени хоста. Поместите вашу команду certutil в
FOR /F
команду и проанализируйте вывод. Затем выведите все в наш файл журнала.2. Вы понимаете, что могли бы просто использовать переменную среды%имя_компьютера% вместо выполнения команды hostname .
3. Вам не хватает обратных кавычек вокруг имени хоста.
Ответ №1:
@echo off
setlocal enableextensions disabledelayedexpansion
for /f "delims=" %%a in ('hostname') do set "host=%%a"
>output.txt (
for %%z in (*.jpg) do for /f "delims=" %%a in ('
certutil -hashfile "%%z" MD5 ^| find /v ":"
') do echo %host%,,%%z,,%%a
)
Вы можете использовать команду %computername%
вместо execute hostname
для получения имени компьютера, но:
- Первое
for /f
выполнениеhostname
команды теперь включает в себяdelims=
предложение для обеспечения (я думаю, что это не нужно, но просто для уверенности), что в имени машины не будет разделения на пробелы. Кроме того, команда для выполнения заключена в одинарные кавычки - Внутренний
for /f
обработает выводcertutil
команды.delims=
также включено для получения полной строки MD5 (в данном случае это требование, поскольку вывод представляет собой отдельный список из двух шестнадцатеричных символов). Выводcerutil -hashfile
также включает в себя информационные строки, которые удаляются, передавая вывод вfind
команду для удаления строк с двоеточием (присутствует в информационных строках, а не в хэше) - Полные
for %%z
, которые повторяют файлы, и внутренниеfor /f
, которые выполняютсяcertutil
, были перенаправлены в выходной файл. Это откроет выходной файл только один раз, отправив в него все выходные данные внутренних команд, отправленных в стандартный поток вывода.
Комментарии:
1. Большое спасибо. Я только что добавил /R c:Users для %%z для и работал отлично