日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Bat腳本-Call,Start,直接調用,goto?四種方式調用批處理_DOS/BAT

更新時間: 2023-02-01 編程語言

1、call命令

CALL從一個批處理程序調用另一個批處理程序,并且不終止父批處理程序。call命令主要有2種用法,一種是調用其他批處理程序(*.bat,*.exe,*.cmd,*.COM),目前常用的是*.exe文件和*.bat文件;另一種是CALL :label arguments

C:\Users\Administrator>help call
從批處理程序調用另一個批處理程序。
?
CALL [drive:][path]filename [batch-parameters]
?
? batch-parameters ? 指定批處理程序所需的命令行信息。
?
如果命令擴展被啟用,CALL 會如下改變:
?
CALL 命令現在將卷標當作 CALL 的目標接受。語法是:
?
? ? CALL:label arguments
?
一個新的批文件上下文由指定的參數所創建,控制在卷標被指定后傳遞到語句。您必須通過達到批腳本文件末兩次來 "exit" 兩次。第一次讀到文件末時,控制會回到 CALL 語句的緊后面。第二次會退出批腳本。鍵入GOTO /?,參看 GOTO :EOF 擴展的描述,此描述允許您從一個批腳本返回。
?
另外,批腳本文本參數參照(%0、%1、等等)已如下改變:
?
?
? ? ?批腳本里的 %* 指出所有的參數(如 %1 %2 %3 %4 %5 ...)
? ? ?批參數(%n)的替代已被增強。您可以使用以下語法:
?
? ? ? ? ?%~1 ? ? ? ? - 刪除引號("),擴展 %1
? ? ? ? ?%~f1 ? ? ? ?- 將 %1 擴展到一個完全合格的路徑名
? ? ? ? ?%~d1 ? ? ? ?- 僅將 %1 擴展到一個驅動器號
? ? ? ? ?%~p1 ? ? ? ?- 僅將 %1 擴展到一個路徑
? ? ? ? ?%~n1 ? ? ? ?- 僅將 %1 擴展到一個文件名
? ? ? ? ?%~x1 ? ? ? ?- 僅將 %1 擴展到一個文件擴展名
? ? ? ? ?%~s1 ? ? ? ?- 擴展的路徑只含有短名
? ? ? ? ?%~a1 ? ? ? ?- 將 %1 擴展到文件屬性
? ? ? ? ?%~t1 ? ? ? ?- 將 %1 擴展到文件的日期/時間
? ? ? ? ?%~z1 ? ? ? ?- 將 %1 擴展到文件的大小
? ? ? ? ?%~$PATH:1 ? - 查找列在 PATH 環境變量的目錄,并將 %1
? ? ? ? ? ? ? ? ? ? ? ?擴展到找到的第一個完全合格的名稱。如果
? ? ? ? ? ? ? ? ? ? ? ?環境變量名未被定義,或者沒有找到文件,
? ? ? ? ? ? ? ? ? ? ? ?此修改符會擴展到空字符串
? ? 可以組合修改符來取得多重結果:
? ? ? ? %~dp1 ? ? ? - 只將 %1 擴展到驅動器號和路徑
? ? ? ? %~nx1 ? ? ? - 只將 %1 擴展到文件名和擴展名
? ? ? ? %~dp$PATH:1 - 在列在 PATH 環境變量中的目錄里查找 %1,
? ? ? ? ? ? ? ? ? ? ? 并擴展到找到的第一個文件的驅動器號和路徑。
? ? ? ? %~ftza1 ? ? - 將 %1 擴展到類似 DIR 的輸出行。
? ? 在上面的例子中,%1 和 PATH 可以被其他有效數值替換。
? ? %~ 語法被一個有效參數號碼終止。%~ 修定符不能跟 %* 使用

1.1調用批處理

命令格式CALL [drive:][path]filename [batch-parameters]

創建文件test.bat 調用文件call.bat


@echo off
set a=環境變量
call call.bat hi hello
pause
exit /b 0
::call.bat
echo %1
echo %2
echo %a%

運行結果如下:

注意:

1、只在test.bat中使用命令@echo off,call.bat中也沒有回顯命令;

?2、在test.bat中設置環境變量,call.bat中可使用該變量

1.2調用目標標簽

注意:

1、調用標簽時需要“:”
2、調用標簽后繼續處理后面命令

實例一

@echo off
call :interCall hi hello
echo 下一步
pause
exit /b 0
 
:intercall
echo %1
echo %2

運行結果:

實例二

@echo off
call :interCall
echo 下一步
:intercall
echo hi
echo hello
PAUSE
exit /b 0
 

2、調用call 和不用call 的區別

1、使用call?不終止父處理進程,不用call 調用批處理后,父處理進程終止,不再處理后續命令

rem test.bat
@echo off
set a=環境變量
call call.bat hi hello
echo 下一步
pause
exit /b 0
rem call.bat
echo %1
echo %2
echo %a%
pause

2.2去掉call call.bat hi hello中的call運行結果如下:

3、goto 命令

?幫助文檔如下

C:\Users\Administrator>help goto
將 cmd.exe 定向到批處理程序中帶標簽的行。
?
GOTO label
?
? label? ?指定批處理程序中用作標簽的文字字符串。
?
標簽必須單獨一行,并且以冒號打頭。如果命令擴展被啟用,GOTO 會如下改變:
?
GOTO 命令現在接受目標標簽 :EOF,這個標簽將控制轉移到當前批腳本文件的結尾。不定義就退出批腳本文件,這是一個容易的辦法。有關能使該功能有用的 CALL 命令的擴展描述,請鍵入CALL /?。

3.1 goto 后面不需要":",直接加label?

3.2 goto 跳至指定label后,不會處理被跳過的命令語句?

@echo off
goto interCall
echo 下一步
:intercall
echo hi
echo hello
PAUSE
exit /b 0

運行結果:并沒有處理“echo 下一步”該語句

4、start類似于創建一個線程

C:\Users\Administrator>help start
啟動一個單獨的窗口運行指定的程序或命令。
?
START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
? ? ? [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
? ? ? [/NODE <NUMA node>] [/AFFINITY <hex affinity mask>] [/WAIT] [/B]
? ? ? [command/program] [parameters]
?
? ? "title"? ? ?在窗口標題欄中顯示的標題。
? ? path? ? ? ? 啟動目錄。
? ? B? ? ? ? ? ?啟動應用程序,但不創建新窗口。應用程序已忽略 ^C 處理。
? ? ? ? ? ? ? ? 除非應用程序啟用 ^C 處理,否則 ^Break 是唯一可以中斷
? ? ? ? ? ? ? ? 該應用程序的方式。
? ? I? ? ? ? ? ?新的環境將是傳遞給 cmd.exe 的原始環境,而不是當前環境。
?
? ? MIN? ? ? ? ?以最小化方式啟動窗口。
? ? MAX? ? ? ? ?以最大化方式啟動窗口。
? ? SEPARATE? ? 在單獨的內存空間中啟動 16 位 Windows 程序。
? ? SHARED? ? ? 在共享內存空間中啟動 16 位 Windows 程序。
? ? LOW? ? ? ? ?在 IDLE 優先級類中啟動應用程序。
? ? NORMAL? ? ? 在 NORMAL 優先級類中啟動應用程序。
? ? HIGH? ? ? ? 在 HIGH 優先級類中啟動應用程序。
? ? REALTIME? ? 在 REALTIME 優先級類中啟動應用程序。
? ? ABOVENORMAL 在 ABOVENORMAL 優先級類中啟動應用程序。
? ? BELOWNORMAL 在 BELOWNORMAL 優先級類中啟動應用程序。
? ? NODE? ? ? ? 將首選非一致性內存結構 (NUMA) 節點指定為十進制整數。
? ? AFFINITY? ? 將處理器關聯掩碼指定為十六進制數字。進程被限制在這些
? ? ? ? ? ? ? ? 處理器上運行。
?
? ? ? ? ? ? ? ? 當 /AFFINITY 和 /NODE 結合時,會對關聯掩碼進行不同的解釋。
? ? ? ? ? ? ? ? 指定關聯掩碼,正如 NUMA 節點的處理器掩碼正確移動到零位
? ? ? ? ? ? ? ? 起始位置一樣。進程被限制在指定關聯掩碼和 NUMA 節點之間的
? ? ? ? ? ? ? ? 那些通用處理器上運行。如果沒有通用處理器,則進程被限制在
? ? ? ? ? ? ? ? 指定的 NUMA 節點上運行。
? ? WAIT? ? ? ? 啟動應用程序并等待它終止。
? ? command/program
? ? ? ? ? ? ? ? 如果它是內部 cmd 命令或批文件,則該命令處理器是使用
? ? ? ? ? ? ? ? cmd.exe 的 /K 開關運行的。這表示運行該命令之后,該窗口
? ? ? ? ? ? ? ? 將仍然存在。
?
? ? ? ? ? ? ? ? 如果它不是內部 cmd 命令或批文件,則它就是一個程序,并將
? ? ? ? ? ? ? ? 作為一個窗口化應用程序或控制臺應用程序運行。
?
? ? parameters? 這些是傳遞給 command/program 的參數。
?
注意: 在 64 位平臺上不支持 SEPARATE 和 SHARED 選項。
?
通過指定 /NODE,可按照利用 NUMA 系統中的內存區域的方式創建進程。例如,可以創建兩個完全通過共享內存互相通信的進程以共享相同的首選 NUMA 節點,從而最大限度地減少內存延遲。如有可能,它們即會分配來自相同 NUMA 節點的內存,并且會在指定節點之外的處理器上自由運行。
?
? ? 啟動 /NODE 1 application1.exe
? ? 啟動 /NODE 1 application2.exe
?
這兩個進程可被進一步限制在相同 NUMA 節點內的指定處理器上運行。在以下示例中, application1 在節點的兩個低順序處理器上運行,而 application2在該節點的其后兩個處理器上運行。該示例假定指定節點至少具有四個邏輯處理器。請注意,節點號可更改為該計算機的任何有效節點號,而無需更改關聯掩碼。
?
? ? 啟動 /NODE 1 /AFFINITY 0x3 application1.exe
? ? 啟動 /NODE 1 /AFFINITY 0xc application2.exe
?
如果命令擴展被啟用,通過命令行或 START 命令的外部命令調用會如下改變:
?
將文件名作為命令鍵入,非可執行文件可以通過文件關聯調用。
? ? (例如,WORD.DOC 會調用跟 .DOC 文件擴展名關聯的應用程序)。
? ? 關于如何從命令腳本內部創建這些關聯,請參閱 ASSOC 和FTYPE 命令。
?
執行的應用程序是 32-位 GUI 應用程序時,CMD.EXE 不等應用程序終止就返回命令提示符。如果在命令腳本內執行,該新行為則不會發生。
?
如果執行的命令行的第一個符號是不帶擴展名或路徑修飾符的字符串 "CMD","CMD" 會被 COMSPEC 變量的數值所替換。這防止從當前目錄提取 CMD.EXE。
?
如果執行的命令行的第一個符號沒有擴展名,CMD.EXE 會使用PATHEXT 環境變量的數值來決定要以什么順序尋找哪些擴展名。PATHEXT 變量的默認值是:
?
? ? ? ? .COM;.EXE;.BAT;.CMD
?
? ? 請注意,該語法跟 PATH 變量的一樣,分號隔開不同的元素。
?
查找可執行文件時,如果沒有相配的擴展名,看一看該名稱是否與目錄名相配。如果確實如此,START 會在那個路徑上調用Explorer。如果從命令行執行,則等同于對那個路徑作 CD /D。

4.1? 可以和 第2段“調用call 和不用call 的區別” 代碼作對比

@echo off
set a=環境變量
start call.bat hi hello
echo 下一步
pause
exit /b 0

call.bat內容如下?

rem call.bat
echo %1
echo %2
echo %a%
pause

運行結果

以下是補充

call的語法如下

CALL [drive:][path] filename [batch-parameters]

其中參數: [Drive:][Path] FileName?

就是指定要調用的批處理程序的位置和名稱。

注意的是 filename 參數必須具有 .bat 或 .cmd 擴展名,

這樣程序才能被條用。

?[batch-parameters] 就是輸入的參數

例如

建立一個腳本test2.bat

內容為

echo "bat2"

echo %1

echo %~1

就可以直接使用

call test2.bat arg1

主要用途

就是在腳本1中,使用call命令調用的腳本2的時候,

會先執行完腳本2然后在繼續執行腳本1。

所有這回使用腳本直接調用test2.bat

內容如下

call test2.bat arg1

echo "this is test1.bat"

start的語法就是

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]?

[/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]?

[/NODE <NUMA node>] [/AFFINITY <hex affinity mask>] [/WAIT] [/B]?

[command/program] [parameters]

主要的用途就是

直接調用程序,

所有的dos和命令行程序都可以由其啟動

例如

start explorer d:\

就是直接啟動D盤

所以綜上所述,

就會發現,

1.調用的程序類型不一樣,

call必須是bat腳本

2. 調用的方式不一樣,

call 會暫停當前腳本,等待調用的腳步運行結束后,在運行當前腳本,

start就會開啟一個窗口直接調用程序,相當于啟動一個新的進程運行程序。而不會等待調用的程序運行結束

小結

批處理:Call,Start,直接調用,三種方式調用批處理;

欄目分類
最近更新