Переменные в циклах Dont Work, Batch - PullRequest
2 голосов
/ 30 августа 2011

Это новый скрипт, и он все еще не работает Я получаю The syntax of the command is incorrect. on FOR /F "USEBACKQ tokens=*" %%A IN ( TYPE "C: \ Windows \ System32 \ tasks \ at! num! ^ | НАЙТИ" Command ") DO (

SETLOCAL ENABLEDELAYEDEXPANSION
set num=1
:START
IF NOT EXIST "C:\Windows\System32\tasks\at%num%" (GOTO:EOF)
FOR /F "USEBACKQ tokens=*" %%A IN (`TYPE "C:\Windows\System32\tasks\at!num! ^| FIND "Command"`) DO (
 set var=%%A
 ECHO %var%
 SET /a num=%num%+1
 PAUSE
)
GOTO:START

Ответы [ 3 ]

2 голосов
/ 31 августа 2011

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

Set num var to 0 
Begin :Loop 
set num var to its current value  ::NOT NEEDED - You've specified this prior to the GOTO 
increment num var by +1 
if myfolder\at* file exists then read at%num% and find a string then output that line to %tmp%\1.txt ::Need quotations on file location. 
set F var to the line stored in %tmp%\1.txt 
set F="%%F: =%%" ::Please explain what you are trying to do with this command. 
set F to start on 10th character and remove the last 11 characters from the line. 
echo the variable 
If it doesn't exist, exit, but if it does return to :Loop

Вы должны сказать нам, что вы пытаетесь.Если это так же просто, как сохранить переменную из выходного текстового файла, set F=<file.txt будет работать.Если этого не произошло, то что-то случилось до этой команды.Тем не менее ... что такое set F="%%F: =%%"?

Если вы не используете переменную цикла FOR, нет необходимости использовать %% на каждом конце переменной.

Если бы это былоЦикл FOR выглядит следующим образом:

SETLOCAL ENABLEDELAYEDEXPANSION
set num=1
:START
IF NOT EXIST "myFolder\at%num%.txt" (GOTO:EOF)
FOR /F "USEBACKQ tokens=*" %%A IN (`TYPE "myFolder\at%num%.txt" ^| FIND /i "string"`) DO (
  PAUSE
  SET var=%%A
  ECHO !var!
  PAUSE
  SET var=!var: =!
  ECHO !var!
  PAUSE
  SET var=!var:~10,-11!
  ECHO !var!
  PAUSE
  SET /a num=!num!+1
  ECHO !num!
  PAUSE
 )
 GOTO:START

Хорошая практика - проверять, работают ли команды, например SET, вставлять ECHO в переменную и PAUSE сразу после каждого раза, когда вы полагаете, что переменная должнабыть изменен.Это позволит отследить, что изменилось в переменной, чтобы вы могли увидеть, была ли ваша команда правильной и были ли внесены изменения.

2 голосов
/ 30 августа 2011

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

Conditionally perform a command for a range of numbers

Syntax   
      FOR /L %%parameter IN (start,step,end) DO command 

Или, может быть, итерации по файлам в папке будет лучше для того, что вы пытаетесь сделать?

Loop through files (Recurse subfolders)

Syntax
      FOR /R [[drive:]path] %%parameter IN (set) DO command

Или перебирая содержимое файла ?

Loop command: against a set of files - conditionally perform
a command against each item.

Syntax
    FOR /F ["options"] %%parameter IN (filenameset) DO command 

    FOR /F ["options"] %%parameter IN ("Text string to process") DO command

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

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

set num=0
:Loop
    set /a num=%num%+1
    if exist "myFolder\at*" (
    TYPE "myFolder\at%num%" | FINDSTR "\<Command\>" > "%temp%\1.txt"
    set /P F=<"%TEMP%\1.txt"
    Echo %F%
    Pause
)
0 голосов
/ 30 августа 2011

Не знаю, в этом ли проблема, но вы пробовали включить:

setlocal enabledelayedexpansion

Затем внутри цикла (или IF(...)) вы используете !foo! для обозначения переменных среды вместо %foo%.

См. setlocal /? и set /? для получения дополнительной информации.

...