簡體   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