|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Сравнение строк - ошибка. |
|
|
CMD/BAT - [решено] Сравнение строк - ошибка.
|
Пользователь Сообщения: 105 |
Здравствуйте. Помогите пожалуйста.
Есть файл 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
|
Профиль | Отправить PM | Цитировать |
Отправлено: 13:41, 25-04-2021 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2732
|
Профиль | Отправить PM | Цитировать epoddubniy,
Цитата Масяня:
Что Вы хотите видеть в переменной %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
|
Профиль | Отправить 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:
|
|
Последний раз редактировалось epoddubniy, 28-04-2021 в 16:19. Отправлено: 16:12, 28-04-2021 | #4 |
Пользователь Сообщения: 105
|
Профиль | Отправить PM | Цитировать |
|
Отправлено: 16:44, 28-04-2021 | #5 |
Ветеран Сообщения: 2732
|
Профиль | Отправить PM | Цитировать Цитата epoddubniy:
Цитата epoddubniy:
Возможно, Вы несколько раз запустите скрипт, и, возможно, ранее этот файл уже был создан. Чтобы не получилось двусмысленности, сначала файл удалим: Del "%FileNo%, а если его и не было, чтобы сообщение об ошибке не выскакивало на экран, направим его в пустоту 2>nul |
||
------- Отправлено: 17:13, 28-04-2021 | #6 |
Пользователь Сообщения: 105
|
Профиль | Отправить 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 |
Ветеран Сообщения: 2732
|
Профиль | Отправить PM | Цитировать Цитата epoddubniy:
Это что-то из разряда фантастики.
Как Вы изобразили, нельзя переменной так в лоб присвоить результат выполнения команды. Я повторил в командном окне Ваши кунштюки и получил ожидаемый результат в скриншоте. Переменная
%stroka% в Echo раскрывается в строку findstr "Ended" D:\archive\1.txt а применённая как команда - вызывает исполнение команды. Вся беда в том, что есть определённые правила написания командных файлов, правила дорожного движения, законы природы, и изобретать свои - увлекательно, но контрпродуктивно. Попробуйте: Получите Формат IF при сравнении строк: If строка1==строка2 действие В этом примере строка1 это 1, далее нет операции == и зачем-то появляется 2, что с синтаксисом If не вяжется. Корректно написать Здесь строка1 - это "1 2 3", строка2 - это "1 2 3" и сопоставление строк происходит корректно. |
|
------- Отправлено: 10:10, 29-04-2021 | #8 |
Пользователь Сообщения: 105
|
Профиль | Отправить PM | Цитировать Цитата epoddubniy:
то есть в это выражении сравнивается не результат выполнения команды, а, как, если бы я подставил сюда строку for /f "tokens=1" %i in ('%stroka%') do @echo %i, то есть если разложить более подробно, у меня получается: эту часть интерпретатор как строку интерпретирует (почему-то tokens тоже, хотя это выражение за кавычкой) а начиная со знака равно - непредвиденные символы Цитата megaloman:
Или это не возможно и я, по незнанию, пытаюсь изобрести что-то. |
||
Последний раз редактировалось epoddubniy, 29-04-2021 в 12:14. Причина: не дописал Отправлено: 12:11, 29-04-2021 | #9 |
Ветеран Сообщения: 1758
|
|
Отправлено: 12:59, 29-04-2021 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|