CMD/BAT - Непонятное поведение переменных внутри FOR

Ответить
Аватара пользователя
dasgespenst

CMD/BAT - Непонятное поведение переменных внутри FOR

Сообщение dasgespenst »

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





Код:

Код: Выделить всё

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>



Вот так вот получаю два совершенно неадекватных, притом разных выхлопа. Откуда такое странное поведение?
Аватара пользователя
Foreigner

Re: CMD/BAT - Непонятное поведение переменных внутри FOR

Сообщение Foreigner »

Код:

Код: Выделить всё

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



Код:
Аватара пользователя
dasgespenst

Re: CMD/BAT - Непонятное поведение переменных внутри FOR

Сообщение dasgespenst »

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



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



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



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



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



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



Спасибо.
Аватара пользователя
Foreigner

Re: CMD/BAT - Непонятное поведение переменных внутри FOR

Сообщение Foreigner »

dasgespenst, Ну можно либо так:



Код:

Код: Выделить всё

echo !MYFILE!| 1>nul findstr /I /R "Txt$" && echo txt exist

Либо так:



Код:

Код: Выделить всё

echo !MYFILE! | 1>nul findstr /I /R "\.Txt" && echo txt exist
Аватара пользователя
Iska

Re: CMD/BAT - Непонятное поведение переменных внутри FOR

Сообщение Iska »

dasgespenst, Ваши «%MYFILE%» и «%ERRORLEVEL%», находящиеся внутри скобок, будут раскрыты в момент вхождения в скобки, посему надо использовать отложенное раскрытие переменных окружения (см. пост
CMD/BAT - Непонятное поведение переменных внутри FOR
). И «if %errorlevel% equ 0 …» имеет смысл заменить на оператор «&&», как показано там же.
Аватара пользователя
dasgespenst

Re: CMD/BAT - Непонятное поведение переменных внутри FOR

Сообщение dasgespenst »

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



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

Re: CMD/BAT - Непонятное поведение переменных внутри FOR

Сообщение dasgespenst »

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
)
Аватара пользователя
dasgespenst

Re: CMD/BAT - Непонятное поведение переменных внутри FOR

Сообщение dasgespenst »

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

Re: CMD/BAT - Непонятное поведение переменных внутри FOR

Сообщение dasgespenst »

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

Вернуться в «Скриптовые языки администрирования Windows»