Windows batch,echo到文件不成功,只打印出ECHO is on.


jenkins 執行Windows batch command的時候,如果想要讀寫文件,echo到文件不成功.

bat 代碼如下:

set ctime=%date%_%time%
echo %ctime%>test.txt
echo %FOLDERNAME%>test.txt
echo "finished!"

 

執行完畢,打開文件只有一句:

 

修改bat代碼:

1 set ctime=%date%_%time%
2 echo %ctime%>test.txt
3 echo %FOLDERNAME%>test.txt
4 echo "finished!">test.txt

 

打開文件發現finished寫入文件成功了。

 

初步懷疑是bat寫入文件只對字符串有效, 對變量失效了。但是仔細一想,這段代碼是逐步執行,不會出現變量延遲的情況。於是,把> 改寫成>> 。

這樣的話代表追加到文件,而不是寫入。

1 set ctime=%date%_%time%
2 echo %ctime%>>test.txt
3 echo %FOLDERNAME%>>test.txt
4 echo "finished!">>test.txt

執行兩次,結果如下:

由此可見,並非是變量和string有所不同,而是echo變量到文件后,ECHO is on被寫入了文件,從而沖掉了之前的echo。

那ECHO is on 又是從哪里來的呢?

 原來代碼里的

echo %FOLDERNAME%>>test.txt

會因為%FOLDERNAME%未定義,打印出來ECHO is on.

為何會如此呢?

因為bat里的有一個命令:echo 執行的結果就是ECHO is on, 當%FOLDERNAME% 未定義的時候,bat會自動將這行代碼解析成:

echo >>test.txt

稍微有點兒詭異,不報錯,而是直接用忽略變量,執行echo的結果寫入test.txt文本文件。這里有兩點:

1. 變量未定義,則該行命令,直接忽略該變量,可能就完全成為了另外一個動作了。如果碰巧該命令能夠順利執行,那么將不會報錯。

這是一個很容易撿漏的地方,如果按照正常邏輯讀代碼,完全正確的腳本,可能會因為沒有正確賦值,成為另外一個完全不同的腳本。(安全隱患。。。。)

2. >>寫入文件的動作,是將>>前面的執行結果寫入。簡單點而說,如果是fn(s) >>test.txt。 那么寫入動作,是會等待fn執行完畢寫入return返回值的。雖然bat沒有函數這一個概念。

至於以后寫bat處理寫入文件:

1.首先清空文件:

cd .>test.txt

2.然后使用>>追加文件寫入需要寫入的內容。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM