中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

批處理中ECHO命令有什么用

發布時間:2021-09-30 14:48:50 來源:億速云 閱讀:240 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關批處理中ECHO命令有什么用的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

眾所周知,如果echo后面跟一個環境變量,但是該變量卻為空時,相當于不加任何參數的echo,即輸出當前echo是on還是off。很多文章或者教程給出的解決方案都是在echo后面加一個點號echo.,這樣就會輸出空行。

代碼如下:


@echo off
echo %demon.tw%
:: ECHO is off.
echo.%demon.tw%


pause據我所知,用echo輸出空行至少有十種方法:

代碼如下:


@echo off

echo=
echo,
echo;

echo+
echo/
echo[
echo]

echo:
echo.
echo\
pause


這十種方法可以分為三組,每組的效率依次遞減。可悲的是,那些被奉為經典的教程給出的卻是效率最低那組中的echo.

echo.不僅效率低下,而且還容易引發錯誤:

代碼如下:


@echo off
cd .>echo
echo.
pause


我知道你很難接受,但事實的確如此。

第一組中echo后面的=,;都是批處理中的分隔符,所以CMD可以正確地解析出echo命令,并把=,;作為echo命令的參數。是的,你沒有看錯,分隔符并不是用來分隔命令與參數,它們通常是參數的一部分。既然是參數,那么為什么不會被輸出?那是因為echo命令直接跳過了參數的第一個字符,從第二個字符開始輸出,而第二個字符是NUL,所以輸出了空行。

你可能又要問,那為什么用空格做分隔符卻不能輸出空行呢?那是因為在輸出之前,CMD要檢查echo命令的參數是不是on或者off,或者參數為空:首先跳過所有空白字符,如果跳過之后字符串就結束了,那么就認為沒有加參數,輸出echo是on還是off;如果字符串沒有結束,就調用wcsnicmp函數來判斷剩下的字符串是否為on或者off,進而修改echo的狀態。

因此加上很多空格也是一樣的效果:

代碼如下:


@echo off
echo
echo on
echo
pause


而對于第二和第三組,事情就沒那么簡單了,由于echo后面跟的并不是分隔符,所以解析之后會被當成一個整體,而echo+ echo/等等顯然又不是內部命令,CMD會把它們當做外部命令進行搜索。嗯,你知道,搜索是很花時間的,這就是為什么它們的效率低于第一組。

可惜的是,CMD花了很大力氣搜索,卻仍然找不到這樣的外部命令,這時候它會嘗試著修復(Fix)命令,看看命令中是否有某些字符(如圖):

批處理中ECHO命令有什么用
可以看到,CMD對:.\的處理跟+[]/不太一樣,如果是+[]/,CMD會直接把它們從命令中刪除并且添加到原有參數的前面;而如果是:.\并且CMD拓展是開啟的話,那么會多調用一次GetFileAttributes函數獲取文件屬性,多調用一次函數自然會多花一些時間,所以第三組的效率又稍稍比第二組的低些。 批處理中ECHO命令有什么用

再來解釋一下為什么echo.有時候會引起錯誤。文件名中是不能出現:.\的,理論上GetFileAttributes函數都應該返回-1(INVALID_FILE_ATTRIBUTES),然而事實卻不是如此,我也不知道這算不算GetFileAttributes函數的BUG:

代碼如下:


#include <stdio.h>
#include <windows.h>

int main()
{
FILE *fp = fopen("echo", "wb");
fclose(fp);
printf("0x%x\n", GetFileAttributes("echo:"));
printf("0x%x\n", GetFileAttributes("echo."));
printf("0x%x\n", GetFileAttributes("echo/"));
return 0;
}


如果你測試一下上面的C程序,就會發現echo.那行返回的不是-1。

如果GetFileAttributes函數返回的不是-1(一般表示文件不存在),也不是0×10(表示文件是文件夾),那么命令還是會保持原來的樣子,當成外部命令運行。

代碼如下:


@echo off
cd .>echo
echo.
pause


‘echo.' is not recognized as an internal or external command, operable program or batch file.

代碼如下:


@echo off
cd .>echo
setlocal disableextensions
echo.
pause


關閉了CMD拓展,沒有問題。

代碼如下:


@echo off
md echo
echo.
pause


echo是文件夾而不是文件,沒有問題。
最后總結一下吧,在大部分情況下,你都應該使用第一組的echo, echo; echo=來進行輸出,它們的效率跟echo (空格)是一樣的,并且可以用來輸出on或者off,在變量為空時還能輸出空行。

但是echo, echo; echo=卻不能輸出以/?開頭的行,如果你需要,可以使用第二組的echo+ echo/ echo[ echo],它們的效率低一些,但能保證原樣輸出。
我不建議你使用第三組的echo: echo. echo\,如果你仍然要像垃圾教程里面那樣用,我也沒有辦法。

感謝各位的閱讀!關于“批處理中ECHO命令有什么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

敦化市| 班戈县| 中牟县| 武冈市| 北流市| 肇源县| 怀远县| 阿克陶县| 秭归县| 大方县| 遂昌县| 施秉县| 巴塘县| 象山县| 阿坝| 丹阳市| 龙海市| 灌阳县| 顺义区| 正定县| 星子县| 桦川县| 巩留县| 尚义县| 曲麻莱县| 瓦房店市| 永年县| 抚远县| 淮阳县| 噶尔县| 奎屯市| 昌邑市| 海南省| 双辽市| 日土县| 绵阳市| 二手房| 美姑县| 房产| 郸城县| 柳州市|