【问题标题】:Variables in loops Dont Work, Batch循环中的变量不起作用,批处理
【发布时间】:2011-08-30 18:04:30
【问题描述】:

这是新脚本,但仍然无法正常工作 我得到The syntax of the command is incorrect.FOR /F "USEBACKQ tokens=*" %%A IN (TYPE "C:\Windows\System32\tasks\at!num! ^| FIND "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

【问题讨论】:

    标签: variables loops batch-file


    【解决方案1】:

    为了理解您的代码,我将首先将其分解为逻辑,然后尝试解决它。如果我遗漏了一个细节,请告诉我...

    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。这将跟踪变量的变化,以便您查看您的命令是否正确以及所做的更改。

    【讨论】:

    • set F="%%F: =%%" 应该从文本中删除空格
    • 我检查了你的脚本,在 IF NOT EXIST "C: \ Windows \ System32 \ Tasks \ at! Num!" (GOTO: EOF) 上出现语法错误
    • 我的错误是 FOR /F "USEBACKQ tokens=*" %%A IN (TYPE "myFolder\at!num! ^| FIND "") DO (
    • 完全编辑我的 FOR 循环脚本。在我的回答中。对其进行了测试,并且可以正常工作。自己试试吧。
    • 我用不同的方法解决了我的问题但非常感谢你的帮助(我检查过,你的脚本现在确实有效)
    【解决方案2】:

    我建议使用 Batch 的内置函数进行循环,请参阅 here

    Conditionally perform a command for a range of numbers
    
    Syntax   
          FOR /L %%parameter IN (start,step,end) DO command 
    

    或者,文件夹中的iterating over files 可能更适合您尝试做的事情?

    Loop through files (Recurse subfolders)
    
    Syntax
          FOR /R [[drive:]path] %%parameter IN (set) DO command
    

    或者iterating over file contents

    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
    

    这个网站有很多例子here 应该会为你指明正确的方向。

    您的代码存在一些问题,我进行了如下修改,以使用临时文件的内容填充变量。

    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
    )
    

    【讨论】:

    • 我的问题实际上并没有增加它工作得很好的数字.. 问题是将 %TEMP%\1.txt 的内容放入变量中并对现在存储的信息进行一些更改在变量中
    • 我想我建议 for 循环方法会给你一个路径作为变量。但是,您的代码中的哪一点不起作用?
    • set /P F=&lt;%TEMP%\1.txt set F="%%F: =%%" set F=%%F:~10,-11%% Echo %%F%%
    • 所以你想提示用户输入一个字符串,(set /P F=&lt;%TEMP%\1.txt)?它会帮助你更多地了解你在做什么。
    • 不,我想做的是将文件的内容存储到一个变量中,然后对现在存储在变量中的信息进行一些更改set /P F=&lt; 应该这样做但在循环中它不起作用
    【解决方案3】:

    我不知道这是否是问题,但您是否尝试过启用:

    setlocal enabledelayedexpansion

    然后,在循环(或IF(...))内,您使用!foo! 来表示环境变量,而不是%foo%

    请参阅setlocal /?set /? 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多