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