Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Сравнение строк - ошибка.

Ответить
Настройки темы
CMD/BAT - [решено] Сравнение строк - ошибка.

Пользователь


Сообщения: 105
Благодарности: 1

Профиль | Отправить PM | Цитировать


Здравствуйте. Помогите пожалуйста.

Есть файл 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

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

Отправлено: 09:36, 25-04-2021

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата epoddubniy:
что я не правильно делаю при сравнении строк? »
Это:
Цитата epoddubniy:
set stroka=findstr "Ended" D:\archive\1.txt »
Что Вы хотите получить таким кодом?
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:41, 25-04-2021 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Contributor


Сообщения: 2709
Благодарности: 1685

Профиль | Отправить PM | Цитировать


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
Длинно за счет того, что я предпочитаю исходные данные определять вверху кода

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 25-04-2021 в 15:03.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:55, 25-04-2021 | #3


Пользователь


Сообщения: 105
Благодарности: 1

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
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:19.


Отправлено: 16:12, 28-04-2021 | #4


Пользователь


Сообщения: 105
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Set "FileNo=Z:\Box_In\NeSuschestvuetEnded.txt" »
объясните пожалуйста, для чего нужно брать все выражение в кавычки после set

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

Отправлено: 16:44, 28-04-2021 | #5


Ветеран


Contributor


Сообщения: 2709
Благодарности: 1685

Профиль | Отправить PM | Цитировать


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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:13, 28-04-2021 | #6


Пользователь


Сообщения: 105
Благодарности: 1

Профиль | Отправить PM | Цитировать


объясните пожалуйста еще один момент. Если я ввожу в командной строке
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!

Отправлено: 06:32, 29-04-2021 | #7


Ветеран


Contributor


Сообщения: 2709
Благодарности: 1685

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: png я2104290941.png
(18.4 Kb, 3 просмотров)

Цитата 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" и сопоставление строк происходит корректно.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:10, 29-04-2021 | #8


Пользователь


Сообщения: 105
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата 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"?
Или это не возможно и я, по незнанию, пытаюсь изобрести что-то.

Последний раз редактировалось epoddubniy, 29-04-2021 в 12:14. Причина: не дописал


Отправлено: 12:11, 29-04-2021 | #9


Ветеран


Сообщения: 1754
Благодарности: 965

Профиль | Цитировать


Цитата epoddubniy:
if "for /f "tokens=1" »
Проверяйте условие в теле for. Здесь такой синтаксис.

Код: Выделить весь код
C:\> for /f "tokens=1" %i in ("%stroka%") do @if "%i"=="Ended" echo Ravno
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:59, 29-04-2021 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Сравнение строк - ошибка.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - [решено] Сравнение строк, а где Like? rudimko Скриптовые языки администрирования Windows 12 08-09-2014 11:34
Сравнение строк в php dimona55 Вебмастеру 3 20-01-2014 20:21
CMD/BAT - [решено] Сравнение строк с переменной и добавление в случае отсутствия zion87 Скриптовые языки администрирования Windows 2 04-01-2013 15:08
сравнение двух массивов строк в Си bool Программирование и базы данных 5 04-05-2005 17:04
Сравнение строк в PHP Dutchman Mihel Вебмастеру 8 06-07-2004 13:04




 
Переход