Показать полную графическую версию : [решено] Сравнение строк - ошибка.
epoddubniy
25-04-2021, 09:36
Здравствуйте. Помогите пожалуйста.
Есть файл 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
Скажите пожалуйста, что я не правильно делаю при сравнении строк?
Прокомментируйте пожалуйста каждый из трех вариантов. Укажите пожалуйста на ошибки в каждом из трех примеров.
что я не правильно делаю при сравнении строк? »
Это:
set stroka=findstr "Ended" D:\archive\1.txt »
Что Вы хотите получить таким кодом?
megaloman
25-04-2021, 14:55
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
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
хотел вот такой скрипт реализовать, на застрял на set stroka2=for /f "tokens=1" %%i in ('%stroka%') do @echo %%i > D:\archive\%%i.txt » никак не могу получить Ended.txt
epoddubniy
28-04-2021, 16:44
Set "FileNo=Z:\Box_In\NeSuschestvuetEnded.txt" »
объясните пожалуйста, для чего нужно брать все выражение в кавычки после set
и как на русский язык перевести это выражение?
2>nul Del "%FileNo%" »
megaloman
28-04-2021, 17:13
объясните пожалуйста, для чего нужно брать все выражение в кавычки после set »Для того, чтобы при наличии пробелов в конце строки (часто в текстовом редакторе визуально они незаметны), они не интерпретировались как часть имени файла.
и как на русский язык перевести это выражение?
2>nul Del "%FileNo%" »
Исходя из Вашей не очень четкой постановки, после работы скрипта должен присутствовать один файл, либо NeSuschestvuetEnded.txt либо SuschestvuetEnded.txt. В переменной %FileNo%, как Вы могли заметить, хранится имя файла, который должен появиться при отсутствии искомого слова, в частности, как Вы указали, NeSuschestvuetEnded.txt.
Возможно, Вы несколько раз запустите скрипт, и, возможно, ранее этот файл уже был создан. Чтобы не получилось двусмысленности, сначала файл удалим:
Del "%FileNo%, а если его и не было, чтобы сообщение об ошибке не выскакивало на экран, направим его в пустоту
2>nul
epoddubniy
29-04-2021, 06:32
объясните пожалуйста еще один момент. Если я ввожу в командной строке
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
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
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 тоже, хотя это выражение за кавычкой) а начиная со знака равно - непредвиденные символы
Как Вы изобразили, нельзя переменной так в лоб присвоить результат выполнения команды. »
скажите пожалуйста, каким образом можно вывод команды (собственно "Ended") передать в строку и потом это значение использовать в в выражении IF "строка1"=="строка2"?
Или это не возможно и я, по незнанию, пытаюсь изобрести что-то.
Foreigner
29-04-2021, 12:59
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
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
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
Код:
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.... - снова
Powershell не рассматривается, или нужно обязательно использовать винтаж? » Спасибо за код! Но для меня powershell - темный лес. Я новичок, только начал винтаж изучать :-)
Код:
@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 »
Спасибо! Сейчас попробую
Вы определитесь, что Вам надо: присвоить переменной stroka значение Ended, если в файле присутствует это слово, и нечто другое (например, сделать ее пустой) в противном случае? »
Да. Если в файле присутствует это слово, то удалить файл и вызвать другой командный файл через call, а если нет этого слова, то ожидание N сек и снова поиск (повтор процедуры)
megaloman
29-04-2021, 16:14
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
@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
Я новичок, только начал винтаж изучать »
Если вы новичок, то изучайте прежде всего современные техники.
Powershell уже 15 лет как существует.
Я новичок, только начал винтаж изучать »
Верное решение. Я, когда собирался в первый раз в Турцию отправиться на море, тоже сразу понял что я новичок в путешествиях. Самолеты для опытных ребят же, так что я, погнал туда на гужевой повозке. Смекалка меня никогда не подводит ;)
DJ Mogarych, есть подводные камни в виде плохой переносимости по версиям.
epoddubniy
01-05-2021, 20:19
ВСЕМ СПАСИБО БОЛЬШОЕ ЗА ПОМОЩЬ!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.