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

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

Ответить
Настройки темы
CMD/BAT - Непонятное поведение переменных внутри FOR

Новый участник


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

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


Делаю маленький скриптик для подготовки к бекапу. Только вот поведение этого скриптика совершенно неадекватное.

Код: Выделить весь код
FOR /r %%A in ("*") DO (

set MYFILE=%%A
echo %MYFILE%| findstr /I /R "Txt$"
If %ERRORLEVEL% EQU 0 echo txt exist

echo %MYFILE%| findstr /I /R "Cmd$"
If %ERRORLEVEL% EQU 0 echo cmd exist

)
Внутри папки файлы archive.cmd и новый текстовой документ.txt

Цитата:
C:\archive>archive.cmd

C:\archive>FOR /R %A in ("*") DO (
set MYFILE=%A
echo | findstr /I /R "Txt$"
If 0 EQU 0 echo txt exist
echo | findstr /I /R "Cmd$"
If 0 EQU 0 echo cmd exist
)

C:\archive>(
set MYFILE=C:\archive\archive.cmd
echo | findstr /I /R "Txt$"
If 0 EQU 0 echo txt exist
echo | findstr /I /R "Cmd$"
If 0 EQU 0 echo cmd exist
)
txt exist
cmd exist

C:\archive>(
set MYFILE=C:\archive\Новый текстовый документ.txt
echo | findstr /I /R "Txt$"
If 0 EQU 0 echo txt exist
echo | findstr /I /R "Cmd$"
If 0 EQU 0 echo cmd exist
)
txt exist
cmd exist

C:\archive>archive.cmd

C:\archive>FOR /R %A in ("*") DO (
set MYFILE=%A
echo C:\archive\Новый текстовый документ.txt | findstr /I /R "Txt$"
If 1 EQU 0 echo txt exist
echo C:\archive\Новый текстовый документ.txt | findstr /I /R "Cmd$"
If 1 EQU 0 echo cmd exist
)

C:\archive>(
set MYFILE=C:\archive\archive.cmd
echo C:\archive\Новый текстовый документ.txt | findstr /I /R "Txt$"
If 1 EQU 0 echo txt exist
echo C:\archive\Новый текстовый документ.txt | findstr /I /R "Cmd$"
If 1 EQU 0 echo cmd exist
)
C:\archive\Новый текстовый документ.txt

C:\archive>(
set MYFILE=C:\archive\Новый текстовый документ.txt
echo C:\archive\Новый текстовый документ.txt | findstr /I /R "Txt$"
If 1 EQU 0 echo txt exist
echo C:\archive\Новый текстовый документ.txt | findstr /I /R "Cmd$"
If 1 EQU 0 echo cmd exist
)
C:\archive\Новый текстовый документ.txt

C:\archive>
Вот так вот получаю два совершенно неадекватных, притом разных выхлопа. Откуда такое странное поведение?

Отправлено: 22:09, 22-06-2015

 

Ветеран


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

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


Код: Выделить весь код
setlocal /?
Код: Выделить весь код
@echo off
setlocal enabledelayedexpansion

FOR /r %%A in ("*") DO (

set MYFILE=%%A
echo !MYFILE! | 1>nul findstr /I /R "Txt$" && echo txt exist
echo !MYFILE! | 1>nul findstr /I /R "Cmd$" && echo cmd exist

)
Но зачем вообще переменная MYFILE, когда можно сразу обрабатывать %%A ? Да и findstr здесь не нужен, можно просто if exist *.txt
Код: Выделить весь код
if /?
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:33, 22-06-2015 | #2



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

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


Новый участник


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

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


>Но зачем вообще переменная MYFILE, когда можно сразу обрабатывать %%A ?

Это я переменные обкатываю.

>Да и findstr здесь не нужен, можно просто if exist *.txt

findstr пригодится тоже.

А что такое восклицательные знаки вокруг MYFILE? И пробел после MYFILE! не попадает в пайп?

PS: Да точно, пробел лишний

Спасибо.

Последний раз редактировалось dasgespenst, 22-06-2015 в 22:50.


Отправлено: 22:41, 22-06-2015 | #3


Ветеран


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

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


dasgespenst, Ну можно либо так:
Код: Выделить весь код
echo !MYFILE!| 1>nul findstr /I /R "Txt$" && echo txt exist
Либо так:
Код: Выделить весь код
echo !MYFILE! | 1>nul findstr /I /R "\.Txt" && echo txt exist

Отправлено: 22:50, 22-06-2015 | #4


Ветеран


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

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


dasgespenst, Ваши «%MYFILE%» и «%ERRORLEVEL%», находящиеся внутри скобок, будут раскрыты в момент вхождения в скобки, посему надо использовать отложенное раскрытие переменных окружения (см. пост #2). И «if %errorlevel% equ 0 …» имеет смысл заменить на оператор «&&», как показано там же.
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:53, 22-06-2015 | #5


Новый участник


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

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


кстати без MYFILE с использрванием "А", я получаю странную ошибку "Достигнут уровень рекурсии, максимально возможный для команды SETLOCAL."

А как можно if exist "*.txt" туда добавить, ему вроде сам файл надо указывать?

Отправлено: 23:06, 22-06-2015 | #6


Ветеран


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

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


dasgespenst,
Код: Выделить весь код
@echo off
setlocal

FOR /r %%A in (*) DO (

echo %%A| 1>nul findstr /I /R "Txt$" && echo txt exist
echo %%A| 1>nul findstr /I /R "Cmd$" && echo cmd exist

)
Код: Выделить весь код
@echo off
setlocal

FOR /r /d %%i in (.) DO (

if exist "%%i\*.txt" echo txt exists

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

Отправлено: 23:42, 22-06-2015 | #7


Новый участник


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

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


А как в подпрограмму добавить FOR? У меня FOR воспринимается как EOF.

Отправлено: 18:16, 28-06-2015 | #8


Ветеран


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

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


dasgespenst, вопрос не понятен, поконкретней.

Отправлено: 19:33, 28-06-2015 | #9



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - Непонятное поведение семерки жекон Хочу все знать 0 29-01-2012 10:33
Непонятное поведение принтера. roniro Непонятные проблемы с Железом 1 27-07-2011 11:43
Непонятное поведение компа Quard Непонятные проблемы с Железом 4 14-01-2010 17:48
НЕпонятное поведение компа Ziki Непонятные проблемы с Железом 4 19-02-2009 12:41
непонятное поведение компов Andrey1 Непонятные проблемы с Железом 23 22-01-2006 02:00




 
Переход