当我在批处理文件中运行下面的代码时,它只会执行第一行并且不会关闭命令窗口

Posted

技术标签:

【中文标题】当我在批处理文件中运行下面的代码时,它只会执行第一行并且不会关闭命令窗口【英文标题】:When i run the code below in a batch file, it will only execute the first line and does not close the command window 【发布时间】:2016-05-02 05:33:58 【问题描述】:

原来在命令前面没有调用,命令窗口也不会关闭,但是在论坛上阅读可能会使其工作。现在命令窗口关闭,但它不会复制文件并且文件确实存在。在我将 call 放在每个命令前面之前,它只会执行第一行并且不会关闭命令窗口。不知道接下来要尝试什么。谢谢

call if exist "e:\DiDiver\models\all_gl_post_sum.mdl" (copy /y "e:\DiDiver\models\all_gl_post_sum.mdl" "e:\DiDiver\models\all_gl_post_sum_0ld.mdl")
call if exist "e:\DiDiver\models\all_gl_post_sum.md0" (copy /y "e:\DiDiver\models\all_gl_post_sum.md0" "e:\DiDiver\models\all_gl_post_sum_0ld.md0")
call if exist "e:\DiDiver\models\all_gl_post_sum.md1" (copy /y "e:\DiDiver\models\all_gl_post_sum.md1" "e:\DiDiver\models\all_gl_post_sum_0ld.md1")
call if exist "e:\DiDiver\models\all_gl_post_sum.md2" (copy /y "e:\DiDiver\models\all_gl_post_sum.md2" "e:\DiDiver\models\all_gl_post_sum_0ld.md2")
call if exist "e:\DiDiver\models\all_gl_post_sum.md3" (copy /y "e:\DiDiver\models\all_gl_post_sum.md3" "e:\DiDiver\models\all_gl_post_sum_0ld.md3")
call if exist "e:\DiDiver\models\all_gl_post_sum.md4" (copy /y "e:\DiDiver\models\all_gl_post_sum.md4" "e:\DiDiver\models\all_gl_post_sum_0ld.md4")
call if exist "e:\DiDiver\models\all_gl_post_sum.md5" (copy /y "e:\DiDiver\models\all_gl_post_sum.md5" "e:\DiDiver\models\all_gl_post_sum_0ld.md5")
call if exist "e:\DiDiver\models\all_gl_post_sum.md6" (copy /y "e:\DiDiver\models\all_gl_post_sum.md6" "e:\DiDiver\models\all_gl_post_sum_0ld.md6")
call if exist "e:\DiDiver\models\all_gl_post_sum.md7" (copy /y "e:\DiDiver\models\all_gl_post_sum.md7" "e:\DiDiver\models\all_gl_post_sum_0ld.md7")
call if exist "e:\DiDiver\models\all_gl_post_sum.md8" (copy /y "e:\DiDiver\models\all_gl_post_sum.md8" "e:\DiDiver\models\all_gl_post_sum_0ld.md8")

【问题讨论】:

你为什么在所有IF 命令前面使用CALL 你不能CALL IF 因为我在这个论坛上搜索并看到在类似情况下推荐的地方。 @JohnL,我看不出你的代码没有 CALL 就无法工作的任何原因。 我也没有,但是当我运行它时,它会执行第一行,然后命令窗口挂起,我必须关闭它。 【参考方案1】:

如前所述,在您的 IF 命令前面添加 CALL 不是答案。

至于您的程序为何挂起,我不确定。我怀疑它可能是您正在复制的一个相当大的文件(和/或您的驱动器特别慢),并且在继续下一行之前只需要一些时间来完成复制。您可以通过在命令提示符下运行 IF ... COPY ... 命令并计算完成所需的时间来测试这一点。

【讨论】:

你是对的。文件很大,我很不耐烦。使用 Windows 资源管理器,我可以看到第一个文件已被复制,但是当我检查批处理文件时,它看起来像是被卡住了。很抱歉给任何人造成不便。【参考方案2】:

您对Call 命令的使用不正确。它只接受一个文件路径参数,用于调用其他命令/批处理文件,或同一命令文件中的子程序/函数:

Syntax
      CALL [drive:][path]filename [parameters]

      CALL :label [parameters]

      CALL internal_cmd

由于您多次执行相同的过程,您应该使用两个批处理文件:一个控制流程,并调用另一个执行该过程的文件:

MainBatch.cmd:

for %k in (1 2 3 4 5 6 7 8) do (
    call copyFiles.cmd %k
)

CopyFiles.cmd:

set rootPath=e:\DiDiver\models\all_gl_post_sum
if exist "%rootPath%.md%1" (
    copy /y "%rootPath%.md%1" "%rootPath%_0ld.md%1"
    echo Copied %rootPath%.md%1
)

如您所见,mainBatch.cmd 文件调用了第二个批处理文件,该文件执行主要处理。这才是使用Call命令的正确方法

【讨论】:

以上是关于当我在批处理文件中运行下面的代码时,它只会执行第一行并且不会关闭命令窗口的主要内容,如果未能解决你的问题,请参考以下文章

当我运行下面的代码时,我正在获取句柄无效,它需要一个字符串并将其传递给远程批处理文件

在 MouseDown 事件处理程序中检测 Ctrl+Left(鼠标按钮)

如何在进行邮件合并(VBA)时自动保存为PDF

Slurm无法运行多个sbatch任务

你能“编译”PHP 代码并上传一个二进制文件,它只会由字节码解释器运行吗?

RestKit - RKObjectMapping 只运行一次