windows - XP 上的 dos 批处理文件中的变量未正确设置

标签 windows if-statement batch-file cmd

我正在尝试编写一个批处理文件,以便在 XP 上的命令提示符下运行。我试图获取遵循特定命名约定的特定路径中的文件列表。我需要复制每个文件实例并将其重命名为静态名称,然后将其放入传输文件夹中。

由于文件可能需要一段时间才能进入传输文件夹,因此我需要在复制下一个文件之前进行检查,以免覆盖上一个文件。我无法使用 SLEEPTIMEOUT 因为我没有安装额外的工具包。我尝试不断循环回到 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/

相关文章:

java - Windows 上的 Android jar/dex 方法计数

python - 如何使用Python脚本解决XML标签没有值的情况下的StopIteration问题

python - for循环内的 sleep 问题

windows - 如何将可执行文件的输出重定向到批处理文件调用?

batch-file - 批处理文件-计数复制的文件数

c# - 将信息传回控制台应用程序窗口的批处理

C++ WIN32 : Short multitasking example

powershell - 在RUN参数下调试Docker容器构建失败

windows - 什么是 Git 的好(免费)可视化 merge 工具? (在 window 上)

java - 如果元素存在,则在selenium Java中执行A,否则执行B