Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Проблема с пробелами в названии (http://forum.oszone.net/showthread.php?t=203456)

Sat_Kelman 30-03-2011 14:54 1647254

Проблема с пробелами в названии
 
День добрый!

Есть батник 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 1647277

Если в адресе\имени файла присутствует пробел, то адресс\имя необходимо включать в кавычки

Цитата:

Цитата Sat_Kelman
set dirLib=T:\Отдел расчетов\Процессы\Сеть\lib »

Код:

set dirLib="T:\Отдел расчетов\Процессы\Сеть\lib"

Sat_Kelman 30-03-2011 15:48 1647278

Вот этот путь как раз не влияет, с таким путем все прекрасно работает. Проверено
Проблема в P:\keys\Наши эксперты\Новая Ляля.cfg

Как я понимаю надо поменять что-то в hash_lst1.cmd

Petya V4sechkin 30-03-2011 15:52 1647282

Sat_Kelman, кодировка DOS-866

Sat_Kelman 30-03-2011 17:10 1647312

И не в кодировке проблема. Такая же проверка есть для других файлов и других папок, там все работает. Но там то нет пробелов в названии папки в списке.
Завтра приду на работу, попробую чтоб он на экран вывел какого файла он найти не может. Отсюда и танцевать будем.

Iska 30-03-2011 20:00 1647411

1. Попробуйте добавить:
Код:

for /f "delims=" %%i in (%hash_lst%) do …
2. Убедиться, что кодировка «hash_expert.lst» — DOS-866.

Было бы желательно объяснить назначение сиих действ, и что должно получаться в итоге.

Sat_Kelman 30-03-2011 20:20 1647421

Назначение:
Есть сетевая папка 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 1647695

Изменил строчку вот так
Код:

for /F %%i in (%hash_lst%) do for %%f in ("%%i") do  %%f
пишет теперь
""P:\keys\Наши"" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.
До первого пробела режет

Iska 31-03-2011 06:59 1647698

Запутанно… Впрочем, кто знает Вашу кухню.

Попробуйте так (предварительно сделав резервные копии исходных пакетных файлов):

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 1647719

Проблема решилась!!!
убрал кавычки в "%%f"
for /F %%i in (%hash_lst%) do for %%f in ("%%i") do "%~dp0\hash3411" %%f

hash3411.exe - понятия не имею что за программка. Работает в режиме командной строки, то есть запускается из батника, и она уже возвращает хэш. Сам в инете про нее искал, не нашел. Была до меня уже.

rrr777 04-12-2013 12:28 2266746

Ребят как правильно прописать в батнике, что-бы происходило копирование файла с заменой если имя файла с пробелом?

Iska 04-12-2013 15:20 2266854

Цитата:

Цитата rrr777
как правильно прописать в батнике, что-бы происходило копирование файла … если имя файла с пробелом? »

Обрамить имя файла кавычками.


Время: 18:23.

Время: 18:23.
© OSzone.net 2001-