Показать полную графическую версию : [решено] Проблема с пробелами в названии
Sat_Kelman
30-03-2011, 14:54
День добрый!
Есть батник hash_lst1.cmd который высчитывает хеш-значения файлов по списку.
@echo off
rem Вычисление хэш-значений файлов по списку
rem Вызов: hash_lst1 [file.lst]
rem где, file.lst - список контролируемых файлов (по умолчанию - hash.lst)
if empty%1==%1empty (set hash_lst=hash.lst) else set hash_lst=%1
for /F %%i in (%hash_lst%) do for %%f in ("%%i") do "%~dp0\hash3411" "%%f"
hash3411 - программка которая вычисляет хэш для файла
Список файлов hash_expert.lst примерно такого содержания
P:\keys\Наши эксперты\Новая Ляля.cfg
P:\keys\Наши эксперты\Новоуральск.cfg
И собственно сам батник hash_expert_set.cmd который вызывается на сервере
@echo off
set dirLib=T:\Отдел расчетов\Процессы\Сеть\lib
cd /d "%~dp0"
call "%dirLib%\hash_lst1" hash_expert.lst > hash_expert.has
echo %date% %time% Обновление списка целостности файлов hash_expert.lst. %username% %computername% >> hash_expert.log
При выполнении пишет - No such file or directory
Опытным путем выяснилось, что проблема в пробелах в названии папки и некоторых файлов которые указаны в hash_expert.lst (Типа P:\keys\Наши эксперты\Новая Ляля.cfg)
Переименовать ни папку ни файл не предоставляется возможным.
А отредактировать батник не могу так чтоб работал корректно. Подскажите что нужно изменить
White-Lion
30-03-2011, 15:41
Если в адресе\имени файла присутствует пробел, то адресс\имя необходимо включать в кавычки
set dirLib=T:\Отдел расчетов\Процессы\Сеть\lib »
set dirLib="T:\Отдел расчетов\Процессы\Сеть\lib"
Sat_Kelman
30-03-2011, 15:48
Вот этот путь как раз не влияет, с таким путем все прекрасно работает. Проверено
Проблема в P:\keys\Наши эксперты\Новая Ляля.cfg
Как я понимаю надо поменять что-то в hash_lst1.cmd
Petya V4sechkin
30-03-2011, 15:52
Sat_Kelman, кодировка DOS-866 (http://oszone.net/2774#q8)
Sat_Kelman
30-03-2011, 17:10
И не в кодировке проблема. Такая же проверка есть для других файлов и других папок, там все работает. Но там то нет пробелов в названии папки в списке.
Завтра приду на работу, попробую чтоб он на экран вывел какого файла он найти не может. Отсюда и танцевать будем.
1. Попробуйте добавить:
for /f "delims=" %%i in (%hash_lst%) do …
2. Убедиться, что кодировка «hash_expert.lst» — DOS-866 (http://oszone.net/2774#q8).
Было бы желательно объяснить назначение сиих действ, и что должно получаться в итоге.
Sat_Kelman
30-03-2011, 20:20
Назначение:
Есть сетевая папка P:\keys\Наши эксперты\. В нее складываются файлы конфигурации.
Цель - проверка целостности этих файлов. Например изменили мы конфигурацию, или новый файл конфиг добавили, то создаем файл hash_expert.lst, в котором указаны полные пути к файлам целостность которых нужно контролировать.
Далее запускаем файл hash_expert_set.cmd. Он запускает файл hash_lst1.cmd и передает ему что нужно хешировать.
Файл hash_lst1.cmd берет каждый файл по полному пути из файла lst, и высчитывает его хеш, результат записывает в файл hash_expert.has.
В итоге имеем файл hash_expert.has, в котором будут эталонные хеши файлов.
А уже на сервере периодически запускается проверка, где хеш этих файлов сравнивается с эталонным, и если они не совпадают значит файл нарушен/подменен/удален/... и сообщается кому следует
Sat_Kelman
31-03-2011, 06:44
Изменил строчку вот так
for /F %%i in (%hash_lst%) do for %%f in ("%%i") do %%f
пишет теперь
""P:\keys\Наши"" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.
До первого пробела режет
Запутанно… Впрочем, кто знает Вашу кухню.
Попробуйте так (предварительно сделав резервные копии исходных пакетных файлов):
hash_expert_set.cmd
@echo off
set dirLib=T:\Отдел расчетов\Процессы\Сеть\lib
cd /d "%~dp0"
call "%dirLib%\hash_lst1" hash_expert.lst
echo %date% %time% Обновление списка целостности файлов hash_expert.lst. %username% %computername% >> hash_expert.log
T:\Отдел расчетов\Процессы\Сеть\lib\hash_lst1.cmd
@echo off
rem Вычисление хэш-значений файлов по списку
rem Вызов: hash_lst1 [file.lst]
rem где, file.lst - список контролируемых файлов (по умолчанию - hash.lst)
set hash_lst=%~1
if not defined hash_lst set hash_lst=hash.lst
if exist "hash_expert.has" del /q /f "hash_expert.has"
for /f "usebackq delims=" %%i in ("%hash_lst%") do (
"%~dp0\hash3411.exe" "%%i" >>hash_expert.has
)
Sat_Kelman, такой ещё вопрос: чем именно пользуетесь для расчёта хэшей, т.е. что есть «hash3411.exe» и можно ли его «пощупать»?
Sat_Kelman
31-03-2011, 07:40
Проблема решилась!!!
убрал кавычки в "%%f"
for /F %%i in (%hash_lst%) do for %%f in ("%%i") do "%~dp0\hash3411" %%f
hash3411.exe - понятия не имею что за программка. Работает в режиме командной строки, то есть запускается из батника, и она уже возвращает хэш. Сам в инете про нее искал, не нашел. Была до меня уже.
Ребят как правильно прописать в батнике, что-бы происходило копирование файла с заменой если имя файла с пробелом?
как правильно прописать в батнике, что-бы происходило копирование файла … если имя файла с пробелом? »
Обрамить имя файла кавычками.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.