首页 文章

从命令窗口执行并双击bat文件时,Windows .Bat文件的行为会有所不同

提问于
浏览
0

从命令窗口执行并双击bat文件时,Windows .Bat文件的行为会有所不同 . 这是我的档案:

ECHO ON
del activity_ftp.log
cd D:\My_Test
IF EXIST united_ops*.csv (
for %%i in (united_ops*.csv) do (
set size=0
set /A size=%%~zi
echo %%i,%size%,397312,624640 > D:\My_Test\activity_ftp.log
)
)

当我通过打开命令窗口并调用它来运行它时,

2 回答

  • 0

    您的代码中存在一些问题 .
    cd d:\My_test 只有在 D: 时才有效,你可以在这里使用 cd /dpushd .

    当解析for块时, echo ...%size% doesn 't work, as it'扩展,而不是在执行时 .

    if exist 似乎是多余的,因为 for %%i in ( united_ops*.csv) 仅在任何文件存在时才会展开 .

    ECHO ON
    setlocal EnableDelayedExpansion
    del activity_ftp.log
    pushd D:\My_Test
    for %%i in (united_ops*.csv) do (
        set size=0
        set /A size=%%~zi         
        echo %%i,!size!,397312,624640 > D:\My_Test\activity_ftp.log
    )
    
  • 3

    以jeb的答案为基础 .

    1)您的FOR循环可以遍历许多与您的模式匹配的文件 . 但是您使用文件重定向的覆盖模式 . 每个找到的文件都会覆盖先前文件的输出 . 您的最终输出文件永远不会有多行 . 您可以使用 >> 更改为追加模式,但有更好的方法 . 将整个循环括在括号中并使用 > 在覆盖模式下重定向一次会更快 .

    2)您将大小设置为0,然后将其设置为文件大小,然后在回显该行后不使用它 . 我怀疑你根本不需要变量,所以你不需要延迟扩展 .

    3)您在顶部删除的文件不包含路径信息,因此可能无法从正确的文件夹中删除 . 即使它是,但由于您无论如何都要以重写模式重定向,因此没有必要 .

    4)您可以在FOR语句中包含路径,而不是更改当前目录 .

    ECHO ON
    >"D:\My_Test\activity_ftp.log" (
      for %%i in ("d:\My_Test\united_ops*.csv") do (
        echo %%~nxi,%%~zi,397312,624640
      )
    )
    

相关问题