最後更新: 2023-04-20
目錄
- Comment
- Batch script set window size
- Variables
- 特殊 Variables
- Windows 的一些路徑 Variable
- 現在的日期及時間
- Colon":" in variable name
- stdin 與 stderr
- Parameter(%0 ~ %9)
- Check file exists
- EXIT
- Assign output of a program to a variable
- PAUSE
- Sleep
- FOR Loop
- Run batch files one by one
- start cmd
- Run batch files Simultaneously
- Multiple commands on a single line
- && 與 &
- Run cmd on exit
- ERRORLEVEL number
- SETLOCAL
- if ... else ...
- windows path variabe
Comment
REM [Message]
:: [Message]
與 commands 同一行的 comment
echo test & :: comment
Batch script set window size
MODE [width],[height]
i.e.
MODE 80,24
Variables
set
- set [<Variable>=[<String>]]
- set [/p] <Variable>=[<PromptString>]
- set /a <Variable>=<Expression>
/p PromptString # Sets the value of Variable to a line of input entered by the user.
/a # Sets String to a numerical expression that is evaluated.
e.g
[1]
set /p MyVar="Please input something: "
[2]
@echo off & cls
set var=testing 1 2 3
echo The variable is "%var%"
pause > null
* "=" 兩邊不能有空格 !!
* 要行的 exe 不能是 VAR 來
特殊 Variables
%~dp0 # 批次檔存在的目錄位置
現在的日期及時間
echo %date%
date /t
03/26/2020 Thu
echo %time%
time /t
15:18:59.21
Colon":" in variable name
Edit/Replace:
%variable:StrToFind=NewStr%
i.e.
:: Replace '1234' with 'Hello' SET test=1234abcd echo %test:1234=Hello% echo %test%
Extract part of a variable (substring):
%variable:~num_chars_to_skip%
%variable:~num_chars_to_skip,num_chars_to_keep%
* This can include negative numbers
SET DATE=%date% SET DAY=%DATE:~0,2% SET MONTH=%DATE:~3,2% SET YEAR=%DATE:~6,4% SET DATE_FRM=%YEAR%-%MONTH%-%DAY%
stdin 與 stderr
If you redirect the output to the NUL device using "dir file.xxx > nul",
you will still see the error message:
File Not Found
To redirect the error message to NUL, use the following command:
dir file.xxx 2> nul
Or, you can redirect the output to one place, and the errors to another.
dir file.xxx > output.msg 2> output.err
You can print the errors and standard output to a single file by using the "&1" command to redirect the output for STDERR to STDOUT and then sending the output from STDOUT to a file:
dir file.xxx 1> output.msg 2>&1
Parameter(%0 ~ %9)
Parameters = %0 ~ %9
- %0 is the program name as it was called,
- %1 is the first command line parameter,
- %2 is the second command line parameter,
test for the existence of a command line parameter
@ECHO OFF IF "%1"=="" ( ECHO "VSS" ) ELSE ( ECHO "BACKUP" )
Quotes
If the passed argument has quotes around it, %1 includes the quotes.
Where as, %~1 provides the argument value with quotes removed.
Check file exists
@echo off IF EXIST filename. ( del filename. ) ELSE ( echo filename. missing. )
EXIT
EXIT [/B] [exitCode]
/B # When used in a batch script, this option will exit only the script (or subroutine) but not CMD.EXE
exitCode # Sets the %ERRORLEVEL% to a numeric number.
i.e.
C:\>echo %ERRORLEVEL%
9009
Assign output of a program to a variable
application arg0 arg1 > temp.txt
set /p VAR=<temp.txt
PAUSE
The most obvious way to pause a batch file is of course the PAUSE command.
This will stop execution of the batch file until someone presses "any key"
Sleep
TIMEOUT
"TIMEOUT" will delay execution of the next command by N seconds,
or until a key is pressed, whichever is shorter.
# press a key to continue ...
TIMEOUT /T 10
# press CTRL+C to quit ...
TIMEOUT /T 10 /NOBREAK
i.e.
@echo off echo %time% timeout 5 /nobreak > NUL echo %time%
另一個 Sleep 方案
# 假設 IP 192.168.0.253 沒有被設備使用, 以下 cmd 會在 60 秒內等對方回應
PING 192.168.0.253 -n 1 -w 60000 >NUL
FOR Loop
FOR /L
Conditionally perform a command for a range of numbers.
* /L 無分大細階
Syntax
FOR /L %%parameter IN (start,step,end) DO command
Key
- start # The first number
- step # The amount by which to increment the sequence
- end # The last number
* A replaceable parameter:
* In a batch file use %%G (on the command line %G)
i.e. Count from 1 up to 100
for /l %x in (1, 1, 5) do echo %x
FOR /G
# echo Sun ~ Sat
FOR %G IN (Sun Mon Tue Wed Thur Fri Sat) DO echo %G
FOR /F
Loop against a set of files,
file-set(filename1, filename2) is one or more file names of file or (dir /b)
Syntax
FOR /F %Variable IN (file-set) DO command
FOR /F ["Options"] %Variable IN (file-set) DO command [command-parameters]
Options
skip=0 A number of lines to skip at the beginning of the file.
eol=; Character at the start of each line to indicate a comment
delims=xxx The delimiter character(s). Default for strings = a space or TAB.
tokens=1 Specifies which numbered items to read from each line
"tokens=*" will cause all items on each line to be processed
Example
[1] 讀 files.ls 一行行列出其內容
# 建立 3 個空檔供測試
copy NUL 1.txt & copy NUL 2.bak & copy NUL 3.txt
# txt 的檔表
dir /b *.txt > files.ls
# 讀 files.ls 一行行列出其內容
FOR /F %f IN (files.ls) DO echo %f
[2] 當 filename 有空格時 ("4.jpg 1.txt")
copy NUL "4.jpg 4.txt"
dir /b *.txt > files.ls
FOR /F "tokens=*" %f IN (files.ls) DO echo "%f"
* 必須用 " 括住 %f, 因為 filename 有空格 - "%f"
Run batch script one by one
要 run 的每個script 前都要加 call
Example
run-all.bat
call C:\bak-jobs\b.bat
call C:\bak-jobs\a.bat
原因係 Backward Compatibility
In ancient dos versions it was not possible to recursively execute batch files.
Then the call command was introduced that called another cmd shell to execute the batch file and
returned execution back to the calling cmd shell when finished.
Call ALL bat in Folder
FOR %x IN (*.bat) DO call "%x"
start cmd
START "title" [/D path] [options] "command" [parameters]
Key:
- title # Text for the CMD window title bar (required.)
- path # Starting directory.
- command # The command, batch file or executable program to run.
- parameters # The parameters passed to the command.
Options:
- /MIN Start window Minimized.
- /MAX Start window Maximized.
- /W or /WAIT Start application and wait for it to terminate.
Example
# Start an application and specify where files will be saved (Working Directory):
START /D c:\apc ...
Run batch files Simultaneously
Monitor.bat
start cmd.exe /C D:\batch1.bat
start cmd.exe /C D:\batch2.bat
start cmd.exe /C D:\batch3.bat
Remark
- /C Carries out the command specified by string and then terminates
- /K Carries out the command specified by string but remains
Multiple commands on a single line
ping 192.168.123.1 > null && echo "mount drive on server"
&& 與 &
& # separates commands on a line. "&" is the Bash equivalent for ";"
&& # runs the second command on the line when the first command comes back successfully, or with an errorlevel of 0.
|| # The opposite of &&.
Run cmd on exit
This is not possible.
CMD do not have any kind of event triggered command.
This includes events such as closing its window, moving its window, scrolling its window contents, and mouse clicks.
方案
Run a secondary cmd in silent mode that will always check the first cmd running with pid.
When the first not appear the secondary trigger the require event and run exit cmd to close itself.
ERRORLEVEL number
Specifies a true condition only if the previous program run by cmd.exe returned an exit code equal to or greater than Number.
其中一次 ping 成功, ERRORLEVEL 就會 0
echo %ERRORLEVEL%
SETLOCAL
EnableDelayedExpansion
cause variables within a batch file to be expanded at execution time rather than at parse time
SETLOCAL EnableDelayedExpansion
"for"的時候在迴圈中想要去改 set Variable 卻無法改變.
set var=0 for %%a in (1 1 1 1 1) do ( set /a var+=%%a echo %var% ) echo %var%
原因是 var 在parse的時候就會被提前展開, 所以在迴圈中 echo 出的值會是一開始parse時候的值
if ... else ...
NOT
IF EXIST "temp.txt" ECHO found IF NOT EXIST "temp.txt" ECHO not found
if ... else ...
IF EXIST "temp.txt" ( ECHO found ) ELSE ( ECHO not found )
String Comparisons
if [not] <String1>==<String2> <Command> [else <Expression>]
CompareOp:
- EQU Equal to
- NEQ Not equal to
- LSS Less than
- LEQ Less than or equal to
- GTR Greater than
- GEQ Greater than or equal to
/i Forces string comparisons to ignore case.
Artimetic Comparisons
SET /A var=1
IF /i "%var%" EQU "1" ECHO equality with 1
Default Value
IF "%var%"=="" (SET var=default value)
ERRORLEVEL
if [not] ERRORLEVEL <Number> <Command> [else <Expression>]
IF "%ERRORLEVEL%" NEQ "0" ( ECHO execution failed )