Компьютерный форум 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=348621)

epoddubniy 25-04-2021 09:36 2956361

Сравнение строк - ошибка.
 
Здравствуйте. Помогите пожалуйста.

Есть файл C:\archive\1.txt в котором присутствует следующая строка: Ended : 22 апреля 2021 г. 14:05:46

Есть bat-файл
set stroka=findstr "Ended" D:\archive\1.txt
if /i -%stroka%==-"Ended*" echo "SuschestvuetEnded" > D:\archive\SuschestvuetEnded.txt ELSE D:\archive\NeSuschestvuetEnded.txt

Появляется ошибка "Ended" was unexpected at this time.

Пробовал вот так
set stroka=findstr "Ended" D:\archive\1.txt
if /i -%stroka% NEQ -"*" echo "SuschestvuetEnded" > D:\archive\SuschestvuetEnded.txt ELSE D:\archive\NeSuschestvuetEnded.txt

Все равно появляется ошибка "Ended" was unexpected at this time.

Попробовал чуть-чуть переделать bat-файл
set stroka=findstr "Ended" D:\archive\1.txt
set stroka2=for /f "tokens=1" %i in ('%stroka%') do @echo %i > D:\archive\%i.txt
rem в предыдущей строке я хотел, чтобы в имени файла было значение переменной, то есть, в данном случае - слово Ended
rem но, в дальнейшем, при наборе команды %stroka2% создается файл %i.txt вместо Ended.txt

Скажите пожалуйста, что я не правильно делаю при сравнении строк?
Прокомментируйте пожалуйста каждый из трех вариантов. Укажите пожалуйста на ошибки в каждом из трех примеров.

Iska 25-04-2021 13:41 2956367

Цитата:

Цитата epoddubniy
что я не правильно делаю при сравнении строк? »

Это:
Цитата:

Цитата epoddubniy
set stroka=findstr "Ended" D:\archive\1.txt »

Что Вы хотите получить таким кодом?

megaloman 25-04-2021 14:55 2956369

epoddubniy,
Цитата:

Цитата Масяня
Хочешь катиться, люби и обломиться

Если пИшите код, ищите способы его отладить.
Что Вы хотите видеть в переменной %stroka% и что реально имеете?
Код:

set stroka=findstr "Ended" D:\archive\1.txt
Echo %stroka%

В %stroka% не результат исполнения команды, как, похоже, Вы ожидали, а естественно строка, которую Вы написали правее знака "="
Решение
Код:

@Echo Off
cls
        Set "FileIn=Z:\Box_In\1.txt"
        Set "KeyWord=Ended : "
        Set "FileYes=Z:\Box_In\SuschestvuetEnded.txt"
        Set "FileNo=Z:\Box_In\NeSuschestvuetEnded.txt"
       
        2>nul Del "%FileNo%"
        FINDSTR /I /C:"%KeyWord%" "%FileIn%" >"%FileYes%" ||(
                2>nul Del "%FileYes%"
                >"%FileNo%" Echo "%KeyWord%" "%FileIn%"
        )
pause
Exit /B

Длинно за счет того, что я предпочитаю исходные данные определять вверху кода

epoddubniy 28-04-2021 16:12 2956586

Код:

chcp 65001
 
rem копируем с диска на диск по маске, вывод сохраняем в файл D:\archive\1.txt
 
robocopy H:\ I:\*.* /maxage:2 /minage:1 > D:\archive\1.txt
 
rem как правило, если копирование завершилось удачно, то в выводимом файле в конце будет строка - Ended : 22 апреля 2021 г. 14:05:46 (будет текущая дата)[/color]
 
rem ищу в файле строку, в которой есть слово Ended. В файле такая строка только одна. Сохраняю значение (то есть всю эту строку в переменную, чтобы потом из нее выделить только слово Ended, чтобы можно было проще сравнивать строчные значения
 
set stroka=findstr "Ended" D:\archive\1.txt

rem вычленяю из строки слово Ended

set stroka2=for /f "tokens=1" %%i in ('%stroka%') do @echo %%i

rem сравниваю строчные значения, чтобы создать файл при успешном сравнении и перейти к следующей операции, т.к. копирование может длиться до 6 часов, то строка Ended появится спустя 6 часов, а до этого времени нужно повторять цикл поиска и потом, спустя 6 часов создать файл.
 
if "%stroka2%=="Ended" go to :del else goto :povtor
 
 
:del
del D:\archive\1.txt, D:\archive\Ended.txt
exit
 
:рovtor
if "%stroka2%=="Ended" go to :del else goto :povtor
 
pause

хотел вот такой скрипт реализовать, на застрял на
Цитата:

Цитата epoddubniy
set stroka2=for /f "tokens=1" %%i in ('%stroka%') do @echo %%i > D:\archive\%%i.txt »

никак не могу получить Ended.txt

epoddubniy 28-04-2021 16:44 2956591

Цитата:

Цитата megaloman
Set "FileNo=Z:\Box_In\NeSuschestvuetEnded.txt" »

объясните пожалуйста, для чего нужно брать все выражение в кавычки после set

и как на русский язык перевести это выражение?
Цитата:

Цитата megaloman
2>nul Del "%FileNo%" »


megaloman 28-04-2021 17:13 2956594

Цитата:

Цитата epoddubniy
объясните пожалуйста, для чего нужно брать все выражение в кавычки после set »

Для того, чтобы при наличии пробелов в конце строки (часто в текстовом редакторе визуально они незаметны), они не интерпретировались как часть имени файла.
Цитата:

Цитата epoddubniy
и как на русский язык перевести это выражение?
2>nul Del "%FileNo%" »

Исходя из Вашей не очень четкой постановки, после работы скрипта должен присутствовать один файл, либо NeSuschestvuetEnded.txt либо SuschestvuetEnded.txt. В переменной %FileNo%, как Вы могли заметить, хранится имя файла, который должен появиться при отсутствии искомого слова, в частности, как Вы указали, NeSuschestvuetEnded.txt.
Возможно, Вы несколько раз запустите скрипт, и, возможно, ранее этот файл уже был создан. Чтобы не получилось двусмысленности, сначала файл удалим:
Del "%FileNo%, а если его и не было, чтобы сообщение об ошибке не выскакивало на экран, направим его в пустоту
2>nul

epoddubniy 29-04-2021 06:32 2956629

объясните пожалуйста еще один момент. Если я ввожу в командной строке
c:\users\admin>set stroka=findstr "Ended" D:\archive\1.txt
c:\users\admin>echo %stroka%
Ended : 22 апреля 2021 г. 14:05:46
c:\users\admin>set stroka2=for /f "tokens=1" %i in ('%stroka%') do @echo %i
c:\users\admin>echo %stroka2%
Ended
c:\users\admin>if "%stroka2%"=="Ended" echo Ravno
Непредвиденное появление: =1" %i in ('findstr "Ended" D:\archive\1.txt') do @echo %i"=="Ended".
c:\users\admin>if "Ended"=="Ended" echo Ravno
Ravno

Не пойму почему при вводе if "Ended"=="Ended" echo Ravno получаю вывод Ravno, а при вводе if "%stroka2%"=="Ended" echo Ravno "Непредвиденное появление...", ведь если ввести echo %stroka2%, то там же четко выводится Ended, то есть "%stroka2%"=="Ended" это же одно и то же что и "Ended"=="Ended" (или я что-то не понимаю...)

Помогите пожалуйста понять, разобраться, Iska, megaloman!

megaloman 29-04-2021 10:10 2956638

Вложений: 1
Цитата:

Цитата epoddubniy
c:\users\admin>set stroka=findstr "Ended" D:\archive\1.txt
c:\users\admin>echo %stroka%
Ended : 22 апреля 2021 г. 14:05:46 »

Это что-то из разряда фантастики.
Как Вы изобразили, нельзя переменной так в лоб присвоить результат выполнения команды. Я повторил в командном окне Ваши кунштюки и получил ожидаемый результат в скриншоте. Переменная
%stroka%
в Echo раскрывается в строку
findstr "Ended" D:\archive\1.txt
а применённая как команда - вызывает исполнение команды.
Вся беда в том, что есть определённые правила написания командных файлов, правила дорожного движения, законы природы, и изобретать свои - увлекательно, но контрпродуктивно.
Попробуйте:
Код:

If 1 2 3==1 2 3 Echo kuku
Получите
Код:

Непредвиденное появление: 2.

Z:\>If 1 2 3==1 2 3 Echo kuku

Формат IF при сравнении строк:
If строка1==строка2 действие
В этом примере строка1 это 1, далее нет операции == и зачем-то появляется 2, что с синтаксисом If не вяжется.
Корректно написать
Код:

If "1 2 3"=="1 2 3" Echo kuku
Здесь строка1 - это "1 2 3", строка2 - это "1 2 3" и сопоставление строк происходит корректно.

epoddubniy 29-04-2021 12:11 2956649

Цитата:

Цитата epoddubniy
c:\users\admin>echo %stroka2% »

прошу прощения, опечатался
то есть
Код:

if "%stroka2%"=="Ended" echo Ravno
в это выражении сравнивается не результат выполнения команды, а, как, если бы я подставил сюда строку for /f "tokens=1" %i in ('%stroka%') do @echo %i, то есть если разложить более подробно, у меня получается:
Код:

if "for /f "tokens=1" %i in ('%stroka%') do @echo %i"=="Ended" echo Ravno
эту часть интерпретатор как строку интерпретирует
Код:

"for /f "tokens
(почему-то tokens тоже, хотя это выражение за кавычкой) а начиная со знака равно - непредвиденные символы
Цитата:

Цитата megaloman
Как Вы изобразили, нельзя переменной так в лоб присвоить результат выполнения команды. »

скажите пожалуйста, каким образом можно вывод команды (собственно "Ended") передать в строку и потом это значение использовать в в выражении IF "строка1"=="строка2"?
Или это не возможно и я, по незнанию, пытаюсь изобрести что-то.

Foreigner 29-04-2021 12:59 2956655

Цитата:

Цитата epoddubniy
if "for /f "tokens=1" »

Проверяйте условие в теле for. Здесь такой синтаксис.

Код:

C:\> for /f "tokens=1" %i in ("%stroka%") do @if "%i"=="Ended" echo Ravno

DJ Mogarych 29-04-2021 13:16 2956659

Powershell не рассматривается, или нужно обязательно использовать винтаж?
Код:

$str1 = (gc D:\temp\123.txt) -match 'ended'
$str2 = "Ended : 23 апреля 2021 г. 14:05:46"
if ($str1 -eq $str2) {
    "Совпадает"
}
else {
    "Не совпадает"
}


megaloman 29-04-2021 15:34 2956679

epoddubniy, Вы определитесь, что Вам надо: присвоить переменной stroka значение Ended, если в файле присутствует это слово, и нечто другое (например, сделать ее пустой) в противном случае?
Код:

@Echo Off
cls
        Set "FileIn=Z:\Box_In\1.txt"
        Set "KeyWord=Ended"
       
        Set "stroka="
        >nul FindStr /I /C:"%KeyWord%" "%FileIn%" && Set "stroka=%KeyWord%"

        If "%stroka%"=="%KeyWord%" (Echo Ravno) Else (Echo Ne ravno)
pause
Exit /B

или так
Код:

@Echo Off
cls
        Set "FileIn=Z:\Box_In\1.txt"
        Set "KeyWord=Ended"
       
        Set "stroka="
        FOR /F "usebackq delims= " %%s IN ("%FileIn%") DO If "%%s"=="%KeyWord%" Set "stroka=%KeyWord%"

        If "%stroka%"=="%KeyWord%" (Echo Ravno) Else (Echo Ne ravno)
pause
Exit /B


epoddubniy 29-04-2021 15:45 2956681

Цитата:

Цитата Foreigner
Код:
C:\> for /f "tokens=1" %i in ("%stroka%") do @if "%i"=="Ended" echo Ravno »

Спасибо! Как раз, то что мне хотелось реализовать. Получился такой код

Код:

chcp 65001
set stroka=findstr "Ended" D:\archive\1.txt

:povtor
for /f "tokens=1" %i in ('%stroka%') do @if "%i"=="Ended" (del D:\archive\1.txt & call D:\archive\Otkliu4enieDiska) else goto :povtor

скажите пожалуйста, каким образом сделать цикл,
Код:

если условие @if "%i"=="Ended" не выполнится, подождать N сек и повторить процедуру: for /f "tokens=1" %i in ('%stroka%') do.... - снова

Цитата:

Цитата DJ Mogarych
Powershell не рассматривается, или нужно обязательно использовать винтаж? »

Спасибо за код! Но для меня powershell - темный лес. Я новичок, только начал винтаж изучать :-)

Цитата:

Цитата megaloman
Код:
@Echo Off
cls
Set "FileIn=Z:\Box_In\1.txt"
Set "KeyWord=Ended"
Set "stroka="
FOR /F "usebackq delims= " %%s IN ("%FileIn%") DO If "%%s"=="%KeyWord%" Set "stroka=%KeyWord%"
If "%stroka%"=="%KeyWord%" (Echo Ravno) Else (Echo Ne ravno)
pause
Exit /B »

Спасибо! Сейчас попробую

Цитата:

Цитата megaloman
Вы определитесь, что Вам надо: присвоить переменной stroka значение Ended, если в файле присутствует это слово, и нечто другое (например, сделать ее пустой) в противном случае? »

Да. Если в файле присутствует это слово, то удалить файл и вызвать другой командный файл через call, а если нет этого слова, то ожидание N сек и снова поиск (повтор процедуры)

megaloman 29-04-2021 16:14 2956688

epoddubniy,
Цикл с ожиданием
Код:

@Echo Off
cls
        Set "FileIn=Z:\Box_In\1.txt"
        Set "KeyWord=Ended"
        Set /A Wait=3
       
        Set "stroka="
        :Begin
                >nul FindStr /I /C:"%KeyWord%" "%FileIn%" && (Set "stroka=%KeyWord%" &GoTo :End)
                TimeOut /T %Wait%
                GoTo :Begin
        :End
        Echo "%stroka%"
pause
Exit /B

Код:

@Echo Off
cls
        Set "FileIn=Z:\Box_In\1.txt"
        Set "KeyWord=Ended"
        Set /A Wait=3
       
        Set "stroka="
        :Begin
                FOR /F "usebackq delims= " %%s IN ("%FileIn%") DO If "%%s"=="%KeyWord%" (Set "stroka=%KeyWord%" &GoTo :End)
                TimeOut /T %Wait%
                GoTo :Begin
        :End
        Echo "%stroka%"
pause
Exit /B

При такой постановке Вам вообще не нужна переменная stroka
Код:

@Echo Off
cls
        Set "FileIn=Z:\Box_In\1.txt"
        Set "KeyWord=Ended"
        Set /A Wait=3
       
        :Begin
                >nul FindStr /I /C:"%KeyWord%" "%FileIn%" && GoTo :End
                TimeOut /T %Wait%
                GoTo :Begin
        :End
        Echo "%KeyWord%"
pause
Exit /B

Код:

@Echo Off
cls
        Set "FileIn=Z:\Box_In\1.txt"
        Set "KeyWord=Ended"
        Set /A Wait=3
       
        :Begin
                FOR /F "usebackq delims= " %%s IN ("%FileIn%") DO If "%%s"=="%KeyWord%" GoTo :End
                TimeOut /T %Wait%
                GoTo :Begin
        :End
        Echo "%KeyWord%"
pause
Exit /B


DJ Mogarych 29-04-2021 16:22 2956689

Цитата:

Цитата epoddubniy
Я новичок, только начал винтаж изучать »

Если вы новичок, то изучайте прежде всего современные техники.
Powershell уже 15 лет как существует.

Fors1k 29-04-2021 18:49 2956706

Цитата:

Цитата epoddubniy
Я новичок, только начал винтаж изучать »

Верное решение. Я, когда собирался в первый раз в Турцию отправиться на море, тоже сразу понял что я новичок в путешествиях. Самолеты для опытных ребят же, так что я, погнал туда на гужевой повозке. Смекалка меня никогда не подводит ;)

Iska 29-04-2021 21:40 2956714

DJ Mogarych, есть подводные камни в виде плохой переносимости по версиям.

epoddubniy 01-05-2021 20:19 2956854

ВСЕМ СПАСИБО БОЛЬШОЕ ЗА ПОМОЩЬ!


Время: 21:26.

Время: 21:26.
© OSzone.net 2001-