2016-08-25 31 views
3

所以我寫了一個批處理,它有一些代碼,通過讀取一個文本文件來檢查它已經運行了多少次,然後在該文本文件中寫回新增加的數字。批處理:爲什麼附加文本文件寫入「ECHO關閉」而不是?

@ECHO OFF 
for /f "delims=" %%x in (TimesRun.txt) do set Build=%%x 
set Build=%Build%+1 
@echo Build value : %Build% 
echo %Build%>>TimesRun.txt 
Pause 

這不好吧追加文本文件,但它增加了 「1 + 1」 給它。傻我!我忘了使用/ a開關來啓用算術運算!但是,當我改變相應的代碼...

@ECHO OFF 
for /f "delims=" %%x in (TimesRun.txt) do set Build=%%x 
set /a Build=%Build%+1 
@echo Build value : %Build% 
echo %Build%>>TimesRun.txt 
Pause 

...一些有趣的情況:而不是追加我的文件,ECHO處於關閉狀態。寫在控制檯上。現在,我知道這通常發生在使用ECHO時沒有文字或空變量。我已經添加了第一個@echo Build value : %Build%專門查看變量Build是否爲空;它不是,計算正確執行。 我已經想通了,

>>TimesRun.txt (echo %Build%) 

確實帶來期望的結果。我仍然不明白爲什麼

echo %Build%>>TimesRun.txt 

不過。我錯過了什麼?

回答

4

您無意中指定了重定向手柄。


Redirection允許你指定一個特定的手柄,它定義了將被重定向:

0  = STDIN (keyboard input) 
1  = STDOUT (text output) 
2  = STDERR (error text output) 
3 ~ 9 = undefined 

對於輸入重定向操作<,處理0默認情況下使用;對於輸出重定向運算符>>>,默認句柄是1

您可以通過在重定向操作符前面放置單個數字圖來顯式指定句柄;例如2>定義爲重定向錯誤文本輸出。


在你echo命令行你正在做的正是這種無意識,當%Build%是一個單一的數字小數字,像1例如:

echo 1>>TimesRun.txt 

爲了避免這種情況,你有以下幾種選擇:

  1. 要反轉語句,以便重定向定義優先:

    >>TimesRun.txt echo %Build% 
    

    這是執行重定向的最一般和最安全的方式。

  2. 要在括號括起來的重定向命令:

    (echo %Build%)>>TimesRun.txt 
    

    這也適用於安全。

  3. 要放SPACE在重定向操作員面前:

    echo %Build% >>TimesRun.txt 
    

    這工作太,但附加SPACE是包含在echo輸出。

另請參閱這篇文章:cmd.exe redirection operators order and position

0

可以定製批量文件重定向以指定要輸出到的位置。

command 1>file.txt重定向STDOUT的輸出FILE.TXT
command 2>file.txt重定向STDERR的輸出FILE.TXT

你創造價值爲1,所以您無意中告訴CMD到echo輸出發送到TimesRun。 txt - 當你自己運行echo時,它打印它的狀態(ON或OFF)。

您也可以說echo %Build% >>TimesRun.txt,並且該空間會阻止將Build的值視爲重定向命令。

0

Microsoft文章Using command redirection operators解釋了3個標準句柄以及如何將它們重定向到另一個句柄,命令,設備,文件或控制檯應用程序。

重定向輸出的寫入處理1 - STDOUT - 到一個文件應該只

  • 使用> ...創建文件,如果不是已經存在或覆蓋現有文件,來完成,或者
  • 使用>> ...創建文件(如果尚不存在或追加到現有文件)。

重定向操作符通常附加在命令行的末尾。但是,這是在使用命令ECHO和字符串輸出到STDOUT的情況下有問題的具有1至9

一個幾個解決方案之一是在命令行的開頭在這種情況下,以指定的重定向結束:

@for /F "delims=" %%x in (TimesRun.txt) do @set Build=%%x 
@set /A Build+=1 
@echo Build value : %Build% 
>>TimesRun.txt echo %Build% 

從命令提示窗口內執行在頂部沒有@echo off此小批量文件顯示了Windows命令處理器預處理每個線路與包含當前值0或完全不存在的文本文件TimesRun.txt之後執行。

echo 1 1>>TimesRun.txt 

可以看出,Windows命令解釋器移動重定向與插入空格結束行和1留給>>

有了上面的批處理代碼>>行預處理後實際執行的是:

echo 2 1>>TimesRun.txt 

指定在結束重定向與1>>,即使用批處理文件

echo %Build%1>>TimesRun.txt 

也白搭因爲這會導致在執行該行時首先運行:

echo 11 1>>TimesRun.txt 

因此11被寫入文件而不是1。這種錯誤的輸出可以通過>>1>>,即前插入空格使用這兩個中的一個來避免:

echo %Build% >>TimesRun.txt 
echo %Build% 1>>TimesRun.txt 

但隨後%Build%後的空間也被寫入到作爲真正執行的文件是:

echo 1 1>>TimesRun.txt 

拖尾空間在這裏沒有問題,但應該避免。

注:在使用算術運算,即set /A ...不是任何串的數字或操作者被自動解釋爲變量名和該變量的當前值被用在評估所述算術表達式。因此,在set /A之後環境變量名稱僅由單詞字符組成,並且以環境變量通常使用的字母字符開頭,因此必須在算術表達式中使用%...%!...!。在命令提示符窗口中,在命令SET輸出到控制檯窗口中運行set /?時解釋了這一點。

相關問題