 |
|
dasgespenst |
22-06-2015 22:09 2521277 |
Непонятное поведение переменных внутри FOR
Делаю маленький скриптик для подготовки к бекапу. Только вот поведение этого скриптика совершенно неадекватное.
Код:
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>
|
Вот так вот получаю два совершенно неадекватных, притом разных выхлопа. Откуда такое странное поведение?
|
Код:
@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 |
22-06-2015 22:41 2521287 |
>Но зачем вообще переменная MYFILE, когда можно сразу обрабатывать %%A ?
Это я переменные обкатываю.
>Да и findstr здесь не нужен, можно просто if exist *.txt
findstr пригодится тоже.
А что такое восклицательные знаки вокруг MYFILE? И пробел после MYFILE! не попадает в пайп?
PS: Да точно, пробел лишний :)
Спасибо.
|
dasgespenst, Ну можно либо так:
Код:
echo !MYFILE!| 1>nul findstr /I /R "Txt$" && echo txt exist
Либо так:
Код:
echo !MYFILE! | 1>nul findstr /I /R "\.Txt" && echo txt exist
|
dasgespenst, Ваши «%MYFILE%» и «%ERRORLEVEL%», находящиеся внутри скобок, будут раскрыты в момент вхождения в скобки, посему надо использовать отложенное раскрытие переменных окружения (см. пост #2). И «if %errorlevel% equ 0 …» имеет смысл заменить на оператор «&&», как показано там же.
|
dasgespenst |
22-06-2015 23:06 2521300 |
кстати без MYFILE с использрванием "А", я получаю странную ошибку "Достигнут уровень рекурсии, максимально возможный для команды SETLOCAL."
А как можно if exist "*.txt" туда добавить, ему вроде сам файл надо указывать?
|
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 |
28-06-2015 18:16 2523435 |
А как в подпрограмму добавить FOR? У меня FOR воспринимается как EOF.
|
dasgespenst, вопрос не понятен, поконкретней.
|
Время: 21:36.
© OSzone.net 2001-