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

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

surgutfred 17-09-2018 18:50 2831801

Findstr и кириллица
 
Вложений: 1
Судя по поиску не я первый с этим мучаюсь, но решение которое бы у меня сработало я не нашел.
Во вложении 2 файла
Внутри файлов меня интересуют два признака, в одном это слово ОВМ-Ф, в другом ОВК-Ф
Мне нужно написать батник который искал бы эти слова в файлах *.din и если нашел ОВМ-Ф, то идет на метку 1, если нашел ОВК-Ф, то на метку 2, если не нашел оба то на метку 3
Что то типа такого:

Код:

set "s=ОВМ-Ф"
type "*.din"|>nul findstr /c:"\<%s%\>" && call :p1 || call :p2

Если заменить искомую фразу на английский вариант, то все норм, а русский не ищет. Исходные файлы *.din менять нельзя

Пробовал указывать кодировку в начале батника chcp 1251 - не помогло
Батник в кодировке 1251 как и файлы din

Elven 17-09-2018 19:12 2831805

сохранить батник в 866 кодировке (например через NPP) и должно поехать.

surgutfred 17-09-2018 19:17 2831808

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 2831809

surgutfred, вместо findstr можно использовать find.

alpap 17-09-2018 20:27 2831813

Цитата:

Цитата surgutfred
слова в файлах *.din »

а какая там кодировка, если utf-8, то возможно в этом и проблема и findstr лучше по "родному" записывать:
Код:

findstr /rc:"\<%s%\>" "*.din"
потому как с type тоже не все в порядке иногда как раз на кодировках.

megaloman 17-09-2018 21:27 2831822

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 2831824

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

surgutfred 18-09-2018 09:29 2831853

megaloman, еще уточняющий вопрос.
если файлов *.din несколько (но они всегда одного типа, смешанных не может быть) как ограничить проверку по одному любому файлу? Иначе он после перехода по метке повторяет одни и те же действия для каждого файла *.din
А то как то не хочется перечислять пару десятков вариантов :(

surgutfred 18-09-2018 12:06 2831873

Может быть несколько din, но при каждом запуске все din одного типа либо все ОВК-Ф либо все ОВМ-Ф либо третий вариант
В итоге например три ОВК-Ф bat переходит по метке ОВК-Ф и выполняет все действия для каждого файла.
В следующий запуск будут например четыре ОВМ-Ф и такая же картина.

Мне в принципе достаточно по одному файлу узнать какого типа данный набор ОВК-Ф, ОВМ-Ф или третий вариант
Мне не нужно что бы цикл обрабатывал каждый файл. Извиняюсь если сразу непонятно объяснил, просто не подумал что он по кругу будет гонять

Пока что я указал 9 признаков, по которым можно вычленить один из файлов по маске, но это в целом 43 лишних строки кода

Если есть вариант что из имеющихся *.din взять любой один и из него вытащить признак было бы круто.

Iska 18-09-2018 13:43 2831885

surgutfred, Вы категорически уверены, что будет:
Цитата:

Цитата surgutfred
все din одного типа либо все ОВК-Ф либо все ОВМ-Ф либо третий вариант
Цитата:

Цитата surgutfred
не нашел оба »

»

и никогда — варианта четыре: ОВК-Ф + ОВМ-Ф и пять: ОВК-Ф + ОВМ-Ф + ни один из них?

surgutfred 18-09-2018 14:00 2831894

Iska, да это недопустимо

megaloman 18-09-2018 14:44 2831899

surgutfred, Вот костыль имеющегося решения: вместо старого For написать
Код:

        FOR %%f IN ("%BoxIn%\%Mask%") DO Call :Finder "%%f" %Fstr% &GoTo :Cont
        :Cont

Цитата:

Цитата surgutfred
Пока что я указал 9 признаков »

Не понял, что такое признаки. Если это "ОВК-Ф" "ОВМ-Ф" и т д, то скрипт сработает для произвольного числа признаков, только укажите их:
Set "Fstr="ОВК-Ф" "ОВМ-Ф" "Тра ля ля" "Ку-ку" "и т д""
только затем напишите сколько нужно процедур, сейчас это :Fstr1, :Fstr2. Если девять признаков, то :Fstr3 ....:Fstr9. Если ни один не найден, :FstrNo
Номер процедурочки соответствует позиции признака в перечислении.

megaloman 18-09-2018 17:02 2831915

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 2832325

Что то вчера вроде писал сообщение, похоже не отправил...

megaloman, спасибо за этот вариант, вполне возможно будет востребован в будущем.

Про 9 признаков я имел ввиду другое, типа временного костыля.

Данный обработчик в зависимости сначала от вида файла по Вашему скрипту, а потом еще и по моей добавке по названию файла копирует определенный набор папок (в зависимости от набора din
10гб - 100гб) Поэтому мне и неинтересно что он обрабатывает по кругу каждый файл и копирует одно и тоже несколько раз. Мне нужно что бы он посмотрел вид файла в первом файле из набора и просто пошел по метке не трогая остальные файлы.

Вариаций файлов din по названию файла около 100 примерно, в каждом наборе дин есть одна, скажем так основная, их штук 35. Я сумел сузить до 9 масок, чтобы вычленить из набора эту основную систему и смотреть признак в ней (ОВК-Ф или ОВМ-Ф).
Но это примерно 40 строчек кода с выборкой основной системы.
Поэтому и спрашивал может есть вариант короче обработать только один любой файл из набора

Iska 21-09-2018 06:45 2832326

Цитата:

Цитата surgutfred
Мне нужно что бы он посмотрел вид файла в первом файле из набора и просто пошел по метке не трогая остальные файлы. »

Цитата:

Цитата surgutfred
может есть вариант короче обработать только один любой файл из набора »

Смотрите сообщение #12.

surgutfred 21-09-2018 10:47 2832354

megaloman, Iska, Спасибо за помощь, пока вроде получил то что нужно. Время покажет все ли я предусмотрел в алгоритме.


Время: 20:06.

Время: 20:06.
© OSzone.net 2001-