繁体   English   中英

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

[英]Windows .Bat file behave differently when executed from command window and by double clicking on the bat file

从命令窗口执行并双击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
)
)

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

您的代码中存在一些问题。
cd d:\\My_test如果你是只会工作D:你可以使用cd /dpushd这里。

echo ...%size%不起作用,因为它在解析for块而不是在执行时会扩展。

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
)

建立在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
  )
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM