教學網站:
- BAT:批處理教學(上) @ 雅痞小宅:: 隨意窩Xuite日誌
- BAT:批處理教學(下) @ 雅痞小宅:: 隨意窩Xuite日誌
- Wikibooks Windows Batch Scripting
系統內建指令:
Command | Description |
---|---|
ASSOC | Associates an extension with a file type (FTYPE). |
BREAK | Sets or clears extended CTRL+C checking. |
CALL | Calls one batch program from another. |
CD, CHDIR | Displays or sets the current directory. |
CHCP | Displays or sets the active code page number. |
CLS | Clears the screen. |
COLOR | Sets the console foreground and background colors. |
COPY | Copies files. |
DATE | Displays and sets the system date. |
DEL, ERASE | Deletes one or more files. |
DIR | Displays a list of files and subdirectories in a directory. |
ECHO | Displays messages, or turns command echoing on or off. |
ELSE | Performs conditional processing in batch programs when “IF" is not true. |
ENDLOCAL | Ends localization of environment changes in a batch file. |
EXIT | Quits the CMD.EXE program (command interpreter). |
FOR | Runs a specified command for each file in a set of files. |
FTYPE | Sets the file type command. |
IF | Performs conditional processing in batch programs. |
MD, MKDIR | Creates a directory. |
MOVE | Moves a file to a new location |
PATH | Sets or modifies the PATH environment |
PAUSE | Causes the command session to pause for user input. |
POPD | Changes to the drive and directory poped from the directory stack |
PROMPT | Sets or modifies the string displayed when waiting for input. |
PUSHD | Pushes the current directory onto the stack, and changes to the new directory. |
RD / RMDIR | Removes the directory. |
REM | A comment command. Unlike double-colon (::), the command can be executed. |
REN / RENAME | Renames a file or directory |
SET | Sets or displays shell environment variables |
SETLOCAL | Creates a child-environment for the batch file. |
SHIFT | Moves the batch parameters forward. |
START | Starts a program with various options. |
TIME | Displays or sets the system clock |
TITLE | Changes the window title |
TYPE | Prints the content of a file to the console. |
VER | Shows the command processor, operating system versions. |
VERIFY | Verifies that file copy has been done correctly. |
VOL | Shows the label of the current volume. |
指令範例:
FOR
Iterates over a series of values, executing a command.
In the following examples, %i is to be used from the command line while %%i is to be used from a batch.
Examples:
- for %%i in (1,2,3) do echo %%i
- In a batch, echoes 1, 2, and 3. In a batch, the command must use a double percent sign.
- The remaining examples are intended to be directly pasted into a command line, so they use a single percent sign and include “@" to prevent repetitive display.
- for %i in (1,2,3) do @echo %i
- From a command line, echoes 1, 2, and 3.
- The for command tries to interpret the items as file names and as patterns of file names containing wildcards.
- It does not complain if the items do not match existing file names, though.
- for %i in (1,2,a*d*c*e*t) do @echo %i
- Unless you happen to have a file matching the third pattern, echoes 1 and 2, discarding the third item.
- for %i in (1 2,3;4) do @echo %i
- Echoes 1, 2, 3, and 4. Yes, a mixture of item separators is used.
- for %i in (*.txt) do @echo %i
- Echoes file names of files located in the current folder and having the .txt extension.
- for %i in (“C:\Windows\system32\*.exe") do @echo %i
- Echoes file names matching the pattern.
- for /r %i in (*.txt) do @echo %i
- Echoes file names with full paths, of files having the extension .txt located anywhere in the current folder including nested folders.
- for /d %i in (*) do @echo %i
- Echoes the names of all folders in the current folder.
- for /r /d %i in (*) do @echo %i
- Echoes the names including full paths of all folders in the current folder, including nested folders.
- for /l %i in (1,1,10) do @echo %i
- Echoes the numbers from 1 to 10.
- for /f “tokens=*" %i in (list.txt) do @echo %i
- For each line in a file, echoes the line.
- for /f “tokens=*" %i in (list1.txt list2.txt) do @echo %i
- For each line in the files, echoes the line.
- for /f “tokens=*" %i in (*.txt) do @echo %i
- Does nothing. Does not accept wildcards to match file names.
- for /f “tokens=1-3 delims=:" %a in (“First:Second::Third") do @echo %c-%b-%a
- Parses a string into tokens delimited by “:".
- The quotation marks indicate the string is not a file name.
- The second and third tokens are stored in %b and %c even though %b and %c are not expressly mentioned in the part of the command before “do".
- The two consecutive colons are treated as one separator; %c is not “" but rather “Third".
- Does some of the job of the cut command from other operating systems.
- for /f “tokens=1-3* delims=:" %a in (“First:Second::Third:Fourth:Fifth") do @echo %c-%b-%a: %d
- As above, just that the 4th and 5th items get captured in %d as “Fourth:Fifth", including the separator.
- for /f “tokens=1-3* delims=:," %a in (“First,Second,:Third:Fourth:Fifth") do @echo %c-%b-%a: %d
- Multiple delimiters are possible.
- for /f “tokens=1-3″ %a in (“First Second Third,item") do @echo %c-%b-%a
- The default delimiters are space and tab. Thus, they differ from the separators used to separate arguments passed to a batch.
- for /f “tokens=*" %i in (‘cd’) do @echo %i
- For each line of the result of a command, echoes the line.
- for /f “tokens=*" %i in (‘dir /b /a-d-h’) do @echo %~nxai
- For each non-hidden file in the current folder, displays the file attributes followed by the file name. In the string “%~nxai", uses the syntax described at #Percent tilde.
- for /f “usebackq tokens=*" %i in (`dir /b /a-d-h`) do @echo %~nxai
- As above, but using the backquote character (`) around the command to be executed.
- for /f “tokens=*" %i in (‘tasklist ^| sort ^& echo End’) do @echo %i
- Pipes and ampersands in the command to be executed must be escaped using caret (^).
- (for %i in (1,2,3) do @echo %i) > anyoldtemp.txt
- To redirect the entire result of a for loop, place the entire loop inside brackets before redirecting. Otherwise, the redirection will tie to the body of the loop, so each new iteration of the body of the loop will override the results of the previous iterations.
- for %i in (1,2,3) do @echo %i > anyoldtemp.txt
- An example related to the one above. It shows the consequence of failing to put the loop inside brackets.
-------------------------------------------- for %%i in (a b c) do ( echo 1 %%i goto :cont echo 2 %%i :cont echo 3 %%i ) -------------------------------------------- -------------------------------------------- for %%i in (a b c) do call :for_body %%i exit /b :for_body echo 1 %1 goto :cont echo 2 %1 :cont exit /b --------------------------------------------
String processing
Getting a substring of a variable by position and length:
Before running the following examples, ensure that %a% equals “abcd" by running this:
- set a=abcd
The examples:
- echo %a:~0,1%
- Result: a
- echo %a:~1,1%
- Result: b
- echo %a:~0,2%
- Result: ab
- echo %a:~1,2%
- Result: bc
- echo %a:~1%
- Result: bcd
- echo %a:~-1%
- Result: d
- echo %a:~-2%
- Result: cd
- echo %a:~0,-2%
- Result: ab
- echo %a:~0,-1%
- Result: abc
- echo %a:~1,-1%
- Result: bc
Testing substring containment:
- if not “%a:bc=%"=="%a%" echo yes
- If variable a contains “bc" as a substring, echo “yes".
- This test is a trick that uses string replacement, discussed below.
- This test does not work if the variable contains a quotation mark.
Testing for “starts with":
- if %a:~0,1%==a echo yes
- If variable a starts with “a", echo “yes".
- if %a:~0,2%==ab echo yes
- If variable a starts with “ab", echo “yes".
String replacement:
- set a=abcd & echo %a:c=%
- Result: abd
- set a=abcd & echo %a:c=e%
- Result: abed
- set a=abcd & echo %a:*c=%
- Result: d
- The asterisk only works at the beginning of the sought pattern; it does not work at the end or in the middle.
See also the help for SET command: set /?.
Splitting a string by any of " “, “,", and “;":
- set myvar=a b,c;d
- for %%a in (%myvar%) do echo %%a
Splitting a string by semicolon, assuming the string contains no quotation marks:
@echo off set myvar=a b;c;d set strippedvar=%myvar% :repeat for /f "delims=;" %%a in ("%strippedvar%") do echo %%a set prestrippedvar=%strippedvar% set strippedvar=%strippedvar:*;=% if not "%prestrippedvar:;=%"=="%prestrippedvar%" goto :repeat