Показать полную графическую версию : [решено] Findstr и кириллица
surgutfred
17-09-2018, 18:50
Судя по поиску не я первый с этим мучаюсь, но решение которое бы у меня сработало я не нашел.
Во вложении 2 файла
Внутри файлов меня интересуют два признака, в одном это слово ОВМ-Ф, в другом ОВК-Ф
Мне нужно написать батник который искал бы эти слова в файлах *.din и если нашел ОВМ-Ф, то идет на метку 1, если нашел ОВК-Ф, то на метку 2, если не нашел оба то на метку 3
Что то типа такого:
set "s=ОВМ-Ф"
type "*.din"|>nul findstr /c:"\<%s%\>" && call :p1 || call :p2
Если заменить искомую фразу на английский вариант, то все норм, а русский не ищет. Исходные файлы *.din менять нельзя
Пробовал указывать кодировку в начале батника chcp 1251 - не помогло
Батник в кодировке 1251 как и файлы din
сохранить батник в 866 кодировке (например через NPP (https://notepad-plus-plus.org/)) и должно поехать.
surgutfred
17-09-2018, 19:17
Elven, попробовал все равно выдает Строка "ОВМ-Ф" - не обнаружена
Весь батник:
@echo off
set "s=ОВМ-Ф"
type "s*.din"|>nul findstr /c:"\<%s%\>" && call :p1 || call :p2
echo После поиска строки, в основной программе,
echo тоже можно еще продолжать работу.
pause& exit
:p1
echo Строка "%s%" существует
echo Можно что-то делать
exit /b
:p2
echo Строка "%s%" - не обнаружена
echo Можно что-то делать... или не делать
exit /b
Petya V4sechkin
17-09-2018, 19:29
surgutfred, вместо findstr можно использовать find.
слова в файлах *.din »
а какая там кодировка, если utf-8, то возможно в этом и проблема и findstr лучше по "родному" записывать:
findstr /rc:"\<%s%\>" "*.din"
потому как с type тоже не все в порядке иногда как раз на кодировках.
megaloman
17-09-2018, 21:27
surgutfred, @Echo Off
cls
>nul chcp 1251
Set "BoxIn=Z:\Box_In\File"
Set "Mask=*.din"
Set "Fstr="ОВК-Ф" "ОВМ-Ф""
FOR %%f IN ("%BoxIn%\%Mask%") DO Call :Finder "%%f" %Fstr%
pause
GoTo :Eof
:Finder
Set /A i=0
:Begin
Set /A i+=1
If "%~2"=="" (Call :FstrNo %1 %2 &Exit /B 0)
FIND /C /I %2 %1 >nul &&(Call :Fstr%i% %1 %2 &Exit /B 0)
Shift /2
GoTo :Begin
GoTo :Eof
:Fstr1
Echo %1 %2
GoTo :Eof
:Fstr2
Echo %1 %2
GoTo :Eof
:FstrNo
Echo %1 No
GoTo :Eof
Батник сохранить в кодировке 1251
surgutfred
17-09-2018, 21:31
megaloman, огромное спасибо, вроде то что нужно, но сегодня башка уже не варит, завтра посмотрю внимательнее
surgutfred
18-09-2018, 09:29
megaloman, еще уточняющий вопрос.
если файлов *.din несколько (но они всегда одного типа, смешанных не может быть) как ограничить проверку по одному любому файлу? Иначе он после перехода по метке повторяет одни и те же действия для каждого файла *.din
А то как то не хочется перечислять пару десятков вариантов :(
surgutfred
18-09-2018, 12:06
Может быть несколько din, но при каждом запуске все din одного типа либо все ОВК-Ф либо все ОВМ-Ф либо третий вариант
В итоге например три ОВК-Ф bat переходит по метке ОВК-Ф и выполняет все действия для каждого файла.
В следующий запуск будут например четыре ОВМ-Ф и такая же картина.
Мне в принципе достаточно по одному файлу узнать какого типа данный набор ОВК-Ф, ОВМ-Ф или третий вариант
Мне не нужно что бы цикл обрабатывал каждый файл. Извиняюсь если сразу непонятно объяснил, просто не подумал что он по кругу будет гонять
Пока что я указал 9 признаков, по которым можно вычленить один из файлов по маске, но это в целом 43 лишних строки кода
Если есть вариант что из имеющихся *.din взять любой один и из него вытащить признак было бы круто.
surgutfred, Вы категорически уверены, что будет:
все din одного типа либо все ОВК-Ф либо все ОВМ-Ф либо третий вариант
не нашел оба »»
и никогда — варианта четыре: ОВК-Ф + ОВМ-Ф и пять: ОВК-Ф + ОВМ-Ф + ни один из них?
surgutfred
18-09-2018, 14:00
Iska, да это недопустимо
megaloman
18-09-2018, 14:44
surgutfred, Вот костыль имеющегося решения: вместо старого For написать FOR %%f IN ("%BoxIn%\%Mask%") DO Call :Finder "%%f" %Fstr% &GoTo :Cont
:Cont
Пока что я указал 9 признаков »Не понял, что такое признаки. Если это "ОВК-Ф" "ОВМ-Ф" и т д, то скрипт сработает для произвольного числа признаков, только укажите их:
Set "Fstr="ОВК-Ф" "ОВМ-Ф" "Тра ля ля" "Ку-ку" "и т д""
только затем напишите сколько нужно процедур, сейчас это :Fstr1, :Fstr2. Если девять признаков, то :Fstr3 ....:Fstr9. Если ни один не найден, :FstrNo
Номер процедурочки соответствует позиции признака в перечислении.
megaloman
18-09-2018, 17:02
surgutfred, Немного изменил постановку
Скрипт выберет все файлы с признаком:
"ОВК-Ф" и сделает для них процедуру :Fstr1
"ОВМ-Ф" и сделает для них процедуру :Fstr2
Если таких признаков куча, соответственно будут делаться :Fstr(с другими номерами)
Если в файлах ни одного признака не найдено, сделается процедура :FstrNo
То есть можно иметь и смесь файлов с разными признаками, и корректно их обработать
@Echo Off
cls
>nul chcp 1251
Set "BoxIn=Z:\Box_In\File"
Set "Ext=.din"
Set "Fstr="ОВК-Ф" "ОВМ-Ф""
Set /A i=0
Set /A Log=0
If Not Exist "%BoxIn%\*%Ext%" Echo "%BoxIn%\*%Ext%" not found &Exit /B 1
For %%p In (%Fstr%) Do (
Call Set /A i+=1
FOR /F "usebackq delims=" %%f IN (`FIND /C /I %%p "%BoxIn%\*%Ext%"`) Do Call :Finder "%%f" "%Ext%" %%p
)
If %Log%==0 Call :FstrNo %Fstr%
pause
GoTo :Eof
:Finder
Set "N=%~1"
Call Set "N=%%N:*%~2: =%%"
Set "File=%~1"
Set "File=%File:*-- =%"
Call Set "File=%%File:: %N%=%%"
If Not "%N%"=="0" Set /A Log=1 &Call :Fstr%i% "%File%" %3
GoTo :Eof
:Fstr1
Echo "ОВК-Ф" %2 %1
GoTo :Eof
:Fstr2
Echo "ОВМ-Ф" %2 %1
GoTo :Eof
:FstrNo
Echo no files with %*
GoTo :Eof
surgutfred
21-09-2018, 06:39
Что то вчера вроде писал сообщение, похоже не отправил...
megaloman, спасибо за этот вариант, вполне возможно будет востребован в будущем.
Про 9 признаков я имел ввиду другое, типа временного костыля.
Данный обработчик в зависимости сначала от вида файла по Вашему скрипту, а потом еще и по моей добавке по названию файла копирует определенный набор папок (в зависимости от набора din
10гб - 100гб) Поэтому мне и неинтересно что он обрабатывает по кругу каждый файл и копирует одно и тоже несколько раз. Мне нужно что бы он посмотрел вид файла в первом файле из набора и просто пошел по метке не трогая остальные файлы.
Вариаций файлов din по названию файла около 100 примерно, в каждом наборе дин есть одна, скажем так основная, их штук 35. Я сумел сузить до 9 масок, чтобы вычленить из набора эту основную систему и смотреть признак в ней (ОВК-Ф или ОВМ-Ф).
Но это примерно 40 строчек кода с выборкой основной системы.
Поэтому и спрашивал может есть вариант короче обработать только один любой файл из набора
Мне нужно что бы он посмотрел вид файла в первом файле из набора и просто пошел по метке не трогая остальные файлы. »
может есть вариант короче обработать только один любой файл из набора »
Смотрите сообщение #12.
surgutfred
21-09-2018, 10:47
megaloman, Iska, Спасибо за помощь, пока вроде получил то что нужно. Время покажет все ли я предусмотрел в алгоритме.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.