我正在尝试编写一个批处理文件,以便在 XP 上的命令提示符下运行。我试图获取遵循特定命名约定的特定路径中的文件列表。我需要复制每个文件实例并将其重命名为静态名称,然后将其放入传输文件夹中。
由于文件可能需要一段时间才能进入传输文件夹,因此我需要在复制下一个文件之前进行检查,以免覆盖上一个文件。我无法使用 SLEEP
或 TIMEOUT
因为我没有安装额外的工具包。我尝试不断循环回到 START
部分,直到文件发送完毕。
我注意到,如果我传递了 for
循环中设置的 %%x
值,那么如果我循环回到 START
部分,有几次,它似乎失去了值(value),被设置为无。所以我尝试设置一个变量来保存该值。
我似乎遇到了变量设置不正确或未清除的问题。最初它继续引用第一个文件,但现在似乎根本没有设置。 ECHO
显示正确的值,但 filename
变量仍然为空。
有谁知道更好的方法吗?预先感谢您的帮助,因为我已经为此浪费了一整天的时间!
这是批处理文件:
@ECHO "At the start of the loop"
@for %%x in (C:\OUTBOUND\customer_file*) do (
@ECHO "In the loop"
@ECHO "loop value ="
@ECHO %%x
SET filename=%%x
@ECHO "filename ="
@ECHO %filename%
@ECHO ...ARCHIVE OUTBOUND CUSTOMER FILE
archivedatafile --sourcefile="%filename%" --archivefolder="..\archivedata\customer" --retentiondays=0
IF NOT %ERRORLEVEL%==0 GOTO ERROR
PAUSE
:START
IF EXIST l:\OutputFile (
@ping 1.1.1.1 -n 1 -w 30000
GOTO START
) ELSE (
COPY %filename% l:\OutputFile /Y
IF NOT %ERRORLEVEL%==0 GOTO ERROR
PAUSE
)
)
GOTO END
:ERROR
@echo off
@ECHO *************************************************************
@ECHO * !!ERROR!! *
@ECHO *************************************************************
:END
SET filename=
最佳答案
foxidrive 提供了一个应该可以工作的脚本,但没有解释为什么你的代码失败以及他如何解决问题。
您有 2 个问题:
1) 只要在循环内执行 GOTO,FOR 循环就会立即中止。 GOTO 目标标签放置在何处并不重要 - GOTO 始终终止循环。 Foxidrive 对 CALL 的使用效果非常好 - 一旦 CALLed 例程返回,循环就会继续。
2) 您尝试在代码块中设置变量,然后在同一代码块中引用新值。 %VAR%
解析语句时会展开,像 IF 和 FOR 这样的复杂命令会一次性完整解析一次。实际上,括号内的任何代码块都会一次性解析。所以 %ERRORLEVEL%
的值和%FILENAME%
将是常量 - 输入 block 之前存在的值。
正如 Endoro 所指出的,解决该问题的一种方法是使用延迟扩展。必须使用 setlocal enableDelayedExpansion
启用延迟扩展,然后使用 !VAR!
扩展变量。该值在执行时而不是解析时扩展。类型HELP SET
从命令提示符获取有关延迟扩展的更多信息。
但请注意,与 FOR 循环一起使用时,延迟扩展可能会导致其自身的问题,因为延迟扩展发生在 FOR 变量扩展之后: %%x
如果该值包含 !
将被损坏。这个问题可以通过 SETLOCAL 和 ENDLOCAL 根据需要仔细切换延迟扩展 ON 和 OFF 来解决。
Foxydrive 的代码通过使用 CALL 避免了整个延迟扩展问题。他的 :NEXT 例程不在 FOR 循环内,因此每次调用时都会重新解析所有命令,因此不需要延迟扩展。
关于windows - XP 上的 dos 批处理文件中的变量未正确设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16700367/