2016-12-09 7 views
0

У меня есть .log-файл в результате проверки sfv.
Он содержит в основном OK, но некоторые Failed и некоторые Not Found.Как указать только одну строку в журнале, если она содержит одну строку на нескольких строках?

Я использовал

findstr /v "OK" "sfv.Log" > "Sfv.Replace.Log" 

только получить ошибочные файлы/папки.

Но он по-прежнему оставляет меня с кучами поврежденных файлов в тех же папках, поэтому журнал еще длинный.

Есть ли простой способ (пакет), что я могу получить только одну строку в папке?

Например, я хотел бы для бревенчатых линий

NOT FOUND *****  CD8542\EN\contents\cnt\FSE14_15_07.swf 
NOT FOUND *****  CD8542\EN\contents\cnt\FSE19_05_01.flv 
NOT FOUND *****  CD8542\EN\contents\cnt\FSE19_05_02.flv 
NOT FOUND *****  CD8542\EN\contents\cnt\FSE19_06_01.flv 
NOT FOUND *****  CD8542\EN\contents\cnt\FSE19_06_05.flv 
NOT FOUND *****  CD8542\EN\contents\cnt\FSE19_06_06.flv 
NOT FOUND *****  CD8542\EN\contents\cnt\FSE19_08_02.flv 
NOT FOUND *****  CD8542\EN\contents\cnt\FSE19_08_03.flv 
NOT FOUND *****  CD8539\Course01\Lesson01\Exi_04\snd\NO.18.mp3 
NOT FOUND *****  CD8539\Course01\Lesson01\Exi_04\snd\NO.180.mp3 
NOT FOUND *****  CD8539\Course01\Lesson01\Exi_04\snd\NO.181.mp3 
NOT FOUND *****  CD8539\Course01\Lesson01\Exi_04\snd\NO.182.mp3 
NOT FOUND *****  CD8539\Course01\Lesson01\Exi_04\snd\NO.183.mp3 
NOT FOUND *****  CD8539\Course01\Lesson01\Exi_04\snd\NO.184.mp3 
FAILED  CRC32  CD0165\Course01\Lesson01\alcap_4\5\q3.xml 
FAILED  CRC32  CD0165\Course01\Lesson01\alcap_4\5\q4.xml 
FAILED  CRC32  CD0165\Course01\Lesson01\alcap_4\5\q5.xml 
FAILED  CRC32  CD0165\Course01\Lesson01\alcap_4\5\q6.xml 
FAILED  CRC32  CD0165\Course01\Lesson01\alcap_4\5\q7.xml 
FAILED  CRC32  CD0165\Course01\Lesson01\alcap_4\5\q8.xml 

выход

NOT FOUND *****  CD8542\EN\contents\cnt\FSE14_15_07.swf 
NOT FOUND *****  CD8539\Course01\Lesson01\Exi_04\snd\NO.18.mp3 
FAILED  CRC32  CD0165\Course01\Lesson01\alcap_4\5\q3.xml 

Таким образом, я могу легко увидеть, какие конкретные папки я могу заменить в целом.

+0

Если у вас есть машина linux, сидящая вокруг, тогда вы можете «cat/path/to/file» rev | cut -d \/-f2- | rev | sort -u' (не отличный ответ, но ...) – varlogtim

+0

Это на сервере Windows 2008 R2. – Norlig

ответ

0

Эта фильтрация задач может быть достигнуто, например, с следующей код партии:

@echo off 
setlocal EnableExtensions EnableDelayedExpansion 
del "Sfv_Replace.log" 2>nul 
for /F "delims=" %%I in ('%SystemRoot%\System32\findstr.exe /V "OK" "sfv.log" 2^>nul') do (
    set "LogLine=%%I" 
    set "FileNameWithPath=!LogLine:*CD=CD!" 
    for %%J in ("!FileNameWithPath!") do set "FilePath=!FileNameWithPath:\%%~nxJ=! 
    set "VariableName=Folder#!FilePath:\=_! 
    if not defined !VariableName! (
     echo !LogLine!>>"Sfv_Replace.log" 
     set "!VariableName!=1" 
    ) 
) 
endlocal 

Файл журнала Sfv_Replace.log удаляется первым, если все еще существует с предыдущего запуска на всех.

Следующих консольное приложение FINDSTR выполняются на файл sfv.log, который выводит все строки не содержащих строку OK регистрозависимой в любом месте строки.

Эти линии обрабатываются внешним За цикл, который сначала назначает всю текущую строку переменной окружения LogLine.

Все, что осталось от CD ... начало каждого пути к каталогу ... удаляется из строки из файла журнала, чтобы получить только имя файла с относительным путем, назначенным переменной окружения FileNameWithPath, используя отложенное расширение, если требуется, когда среда переменная определена/изменена в командном блоке, начиная с ( и заканчивая совпадением ), и значение которого указано в том же командном блоке.

Все значения FileNameWithPath на запуск пакетного файла на примере линий:

CD8542\EN\contents\cnt\FSE14_15_07.swf 
CD8542\EN\contents\cnt\FSE19_05_01.flv 
CD8542\EN\contents\cnt\FSE19_05_02.flv 
CD8542\EN\contents\cnt\FSE19_06_01.flv 
CD8542\EN\contents\cnt\FSE19_06_05.flv 
CD8542\EN\contents\cnt\FSE19_06_06.flv 
CD8542\EN\contents\cnt\FSE19_08_02.flv 
CD8542\EN\contents\cnt\FSE19_08_03.flv 
CD8539\Course01\Lesson01\Exi_04\snd\NO.18.mp3 
CD8539\Course01\Lesson01\Exi_04\snd\NO.180.mp3 
CD8539\Course01\Lesson01\Exi_04\snd\NO.181.mp3 
CD8539\Course01\Lesson01\Exi_04\snd\NO.182.mp3 
CD8539\Course01\Lesson01\Exi_04\snd\NO.183.mp3 
CD8539\Course01\Lesson01\Exi_04\snd\NO.184.mp3 
CD0165\Course01\Lesson01\alcap_4\5\q3.xml 
CD0165\Course01\Lesson01\alcap_4\5\q4.xml 
CD0165\Course01\Lesson01\alcap_4\5\q5.xml 
CD0165\Course01\Lesson01\alcap_4\5\q6.xml 
CD0165\Course01\Lesson01\alcap_4\5\q7.xml 
CD0165\Course01\Lesson01\alcap_4\5\q8.xml 

Внутренний ДЛЯ цикл используется для получения от имени файла с относительным путем только имя файла и расширение файла которые затем удаляются из имени файла с путём, чтобы получить только относительный путь каталога, хранящийся в переменной окружения FilePath.

Все значения FilePath на запуск пакетного файла на примере линий:

CD8542\EN\contents\cnt 
CD8542\EN\contents\cnt 
CD8542\EN\contents\cnt 
CD8542\EN\contents\cnt 
CD8542\EN\contents\cnt 
CD8542\EN\contents\cnt 
CD8542\EN\contents\cnt 
CD8542\EN\contents\cnt 
CD8539\Course01\Lesson01\Exi_04\snd 
CD8539\Course01\Lesson01\Exi_04\snd 
CD8539\Course01\Lesson01\Exi_04\snd 
CD8539\Course01\Lesson01\Exi_04\snd 
CD8539\Course01\Lesson01\Exi_04\snd 
CD8539\Course01\Lesson01\Exi_04\snd 
CD0165\Course01\Lesson01\alcap_4\5 
CD0165\Course01\Lesson01\alcap_4\5 
CD0165\Course01\Lesson01\alcap_4\5 
CD0165\Course01\Lesson01\alcap_4\5 
CD0165\Course01\Lesson01\alcap_4\5 
CD0165\Course01\Lesson01\alcap_4\5 

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

Все значения VariableName на запуск пакетного файла на примере линий:

Folder#CD8542_EN_contents_cnt 
Folder#CD8542_EN_contents_cnt 
Folder#CD8542_EN_contents_cnt 
Folder#CD8542_EN_contents_cnt 
Folder#CD8542_EN_contents_cnt 
Folder#CD8542_EN_contents_cnt 
Folder#CD8542_EN_contents_cnt 
Folder#CD8542_EN_contents_cnt 
Folder#CD8539_Course01_Lesson01_Exi_04_snd 
Folder#CD8539_Course01_Lesson01_Exi_04_snd 
Folder#CD8539_Course01_Lesson01_Exi_04_snd 
Folder#CD8539_Course01_Lesson01_Exi_04_snd 
Folder#CD8539_Course01_Lesson01_Exi_04_snd 
Folder#CD8539_Course01_Lesson01_Exi_04_snd 
Folder#CD0165_Course01_Lesson01_alcap_4_5 
Folder#CD0165_Course01_Lesson01_alcap_4_5 
Folder#CD0165_Course01_Lesson01_alcap_4_5 
Folder#CD0165_Course01_Lesson01_alcap_4_5 
Folder#CD0165_Course01_Lesson01_alcap_4_5 
Folder#CD0165_Course01_Lesson01_alcap_4_5 

Последний проверяется для переменной текущей среды имени, если существует переменная окружения с таким именем уже определена. Строка из файла журнала игнорируется, если это так. В противном случае строка из файла журнала выводится с переадресацией в файл журнала Sfv_Replace.log, на который она добавляется, и переменная среды определена со значением 1.

Итак, наконец, файл Sfv_Replace.log содержит только иллюстративную линию:

NOT FOUND *****  CD8542\EN\contents\cnt\FSE14_15_07.swf 
NOT FOUND *****  CD8539\Course01\Lesson01\Exi_04\snd\NO.18.mp3 
FAILED  CRC32  CD0165\Course01\Lesson01\alcap_4\5\q3.xml 

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

  • del /?
  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • set /?
  • setlocal /?

См. Также статью Microsoft Using command redirection operators.

На 2^>nul угле кронштейн > маскируется каретка характера ^ быть интерпретирован разбором FOR командной строки как буквенный символ, а затем на выполнении Findstr как оператор перенаправления для перенаправления вывода сообщения об ошибке на Findstr для обработки STDERR к устройству NUL для подавления его в случае отсутствия sfv.log при исполнении командного файла.