2023年11月27日发(作者:)
bat批处理切换到当前脚本所在⽂件夹
切换到当前脚本所在的⽂件夹
cd %~dp0
另外附上⼀些bat基本内容
——————————————————————————————
批处理常⽤命令总结 - 批处理命令简介
⽬录
echo
打开回显或关闭请求回显功能,或显⽰消息。如果没有任何参数,echo 命令将显⽰当前回显设置。
echo [{on|off}] [message]
Sample:@echo off / echo hello world
在实际应⽤中我们会把这条命令和重定向符号(也称为管道符号,⼀般⽤> >> ^)结合来实现输⼊⼀些命令到特定的⽂件中。
rem
注释命令,类似于在C语⾔中的/*--------*/,它并不会被执⾏,只是起⼀个注释的作⽤,便于别⼈阅读和你⾃⼰⽇后修改。
Rem Message
Sample:@Rem Here is the description.
pause
暂停命令。运⾏ Pause 命令时,将显⽰下⾯的消息:Press any key to continue. . .(或:请按任意键继续. . .)
Sample:
@echo off
:begin
copy G:*.* d:/back
echo 请插⼊另⼀张光盘...
pause
goto begin
在这个例⼦中,驱动器 G 中磁盘上的所有⽂件均复制到d:/back中。显⽰的注释提⽰您将另⼀张光盘盘放⼊驱动器 G 时,pause 命令会使程
序挂起,以便您更换光盘,然后按任意键继续处理。
call
从⼀个批处理程序调⽤另⼀个批处理程序,并且不终⽌⽗批处理程序。call 命令接受⽤作调⽤⽬标的标签。如果在脚本或批处理⽂件外使⽤
Call,它将不会在命令⾏起作⽤。
call [[Drive:][Path] FileName ] [:label [arguments]]
参数
[Drive:}[Path] FileName
指定要调⽤的批处理程序的位置和名称。
start 命令
调⽤外部程序,所有的DOS命令和命令⾏程序都可以由start命令来调⽤。 如:start 即可打开Windows的计算器。
常⽤参数:
MIN 开始时窗⼝最⼩化
SEPARATE 在分开的空间内开始 16 位 Windows 程序
HIGH 在 HIGH 优先级类别开始应⽤程序
REALTIME 在 REALTIME 优先级类别开始应⽤程序
WAIT 启动应⽤程序并等候它结束
parameters 这些为传送到命令/程序的参数
执⾏的应⽤程序是 32-位 GUI 应⽤程序时, 不等应⽤程序终⽌就返回命令提⽰。如果在命令脚本内执⾏,该新⾏为则不会发⽣。
goto
跳转命令。程序指针跳转到指定的标签,从标签后的第⼀条命令开始继续执⾏批处理程序。
goto label (label是参数,指定所要转向的批处理程序中的⾏。)
Sample:
if {%1}=={} goto noparms
if {%2}=={} goto noparms(如果这⾥的if、%1、%2你不明⽩的话,先跳过去,后⾯会有详细的解释
。)
@Rem check parameters if null show usage
:noparms
echo Usage: ServerIP PortNumber
goto end
标签的名字可以随便起,但是最好是有意义的字母啦,字母前加个:⽤来表⽰这个字母是标签,goto命令就是根据这个:来寻找下⼀步跳到
到那⾥。最好有⼀些说明这样你别⼈看起来才会理解你的意图啊。
set
显⽰、设置或删除变量。
显⽰变量:set 或 set s 前者显⽰批处理当前已定义的所有变量及其值,后者显⽰所有以s开头的变量及值。
设置变量:set aa=abcd 此句命令便可向变量aa赋值abcd。
如果变量aa已被定义,则aa的值被修改为abcd;若aa尚未定义,则此句命令即可定义新的变量aa,同时为变量aa赋予初始值abcd。
删除变量:set aa= 此句命令即可删除变量aa。若变量aa已被定义,则删除变量aa;若aa尚未定义,则此句命令为实质意义。
需要说明的是,批处理中的变量是不区分类型的,不需要像C语⾔中的变量那样还要区分int、float、char等。⽐如执⾏set aa=345后,变量
aa的值既可以被视为数字345,也可以被视为字符串345。
set命令具有扩展功能,如⽤作交互输⼊、字符串处理、数值计算等,属于⾼级命令范畴。
批处理常⽤命令及⽤法⼤全
阅读下⾯⽂字需要⼀定的dos基础概念,象:盘符、⽂件、⽬录(⽂件夹)、⼦⽬录、根⽬录、当前⽬录
每个命令的完整说明请加 /? 参数参考微软的帮助⽂档可以看到,在 /? 帮助⾥,"命令扩展名"⼀词会经常出现"命令扩展名"是指相对于win98
的dos版本⽽⾔,每个命令新增的功能命令测试环境win2000proSP4win98的命令功能太少,就不作研究了。
注:如果对某⼀命令还不是很熟悉,可以在命令⾏窗⼝下输⼊:命令名/?的⽅式来获得帮助。
例如:对dir命令的应⽤不熟悉,可以在命令⾏窗⼝下输⼊:dir /?
echo 和 @回显控制命令
@ #关闭单⾏回显
echo off #从下⼀⾏开始关闭回显
@echo off #从本⾏开始关闭回显。⼀般批处理第⼀⾏都是这个
echo on #从下⼀⾏开始打开回显
echo #显⽰当前是 echo off 状态还是 echo on 状态
echo. #输出⼀个"回车换⾏",⼀般就是指空⽩⾏
echo hello world #输出hello world
"关闭回显"是指运⾏批处理⽂件时,不显⽰⽂件⾥的每条命令,只显⽰运⾏结果批处理开始和结束时,系统都会⾃动打开
errorlevel程序返回码
echo %errorlevel%每个命令运⾏结束,可以⽤这个命令⾏格式查看返回码⽤于判断刚才的命令是否执⾏成功默认值为0,
⼀般命令执⾏出错会设 errorlevel 为1
dir显⽰⽬录中的⽂件和⼦⽬录列表
dir #显⽰当前⽬录中的⽂件和⼦⽬录
dir /a #显⽰当前⽬录中的⽂件和⼦⽬录,包括隐藏⽂件和系统⽂件
dir c: /a:d #显⽰ C 盘当前⽬录中的⽬录
dir c:/ /a:-d #显⽰ C 盘根⽬录中的⽂件dir d:/mp3 /b/p #逐屏显⽰ d:/mp3 ⽬录⾥的⽂件,只显⽰⽂件名,不显⽰时间和⼤⼩
dir *.exe /s #显⽰当前⽬录和⼦⽬录⾥所有的.exe⽂件其中 * 是通配符,代表所有的⽂件名,还⼀个通配符 ? 代表⼀个
#任意字母或汉字如 c*.* 代表以 c 开头的所有⽂件?.exe 代表所有⽂件名是⼀个字母的.exe⽂件如果指定的⽬录或⽂件
#不存在,将返回 errorlevel 为1;
# 每个⽂件夹的 dir 输出都会有2个⼦⽬录 . 和 ... 代表当前⽬录.. 代表当前⽬录的上级⽬录
dir . #显⽰当前⽬录中的⽂件和⼦⽬录
dir .. #显⽰当前⽬录的上级⽬录中的⽂件和⼦⽬录
其它参数可参考 dir /?
cd更改当前⽬录
cd mp3 #进⼊当前⽬录中的mp3 ⽬录
cd .. #进⼊当前⽬录中的上级⽬录
cd/ #进⼊根⽬录
cd #显⽰当前⽬录
cd /d d:/mp3 #可以同时更改盘符和⽬录
cd "Documents and Settings"/All users⽂件名带空格,路径前需要加上引号!!如果更改到的⽬录不存在,则出错返
md abc #在当前⽬录⾥建⽴⼦⽬录 abc
md d:/a/b/c #如果 d:/a 不存在,将会⾃动创建
rd abc #删除当前⽬录⾥的 abc ⼦⽬录,要求为空⽬录
rd /s/q d:/temp #删除 d:/temp ⽂件夹及其⼦⽂件夹和⽂件,不需要按 Y 确认
del d:/ #删除指定⽂件,不能是隐藏、系统、只读⽂件
del *.*删除当前⽬录⾥的所有⽂件,不包括隐藏、系统、只读⽂件,要求按 Y 确认
del /q/a/f d:/temp/*.*删除 d:/temp ⽂件夹⾥⾯的所有⽂件,包括隐藏、只读、系统⽂件,不包括⼦⽬录
del /q/a/f/s d:/temp/*.*删除 d:/temp 及⼦⽂件夹⾥⾯的所有⽂件,包括隐藏、只读、系统⽂件,不包括⼦⽬录
ren #把 更名为
ren *.txt *.ini #把当前⽬录⾥所有.txt⽂件改成.ini⽂件
ren d:/temp tmp #⽀持对⽂件夹的重命名
type c:/ #显⽰指定⽂件的内容,程序⽂件⼀般会显⽰乱码
type *.txt #显⽰当前⽬录⾥所有.txt⽂件的内容
copy c:/ d:/复制 c:/ ⽂件到 d:/
copy c:/ d:/复制 c:/ ⽂件到 d:/ ,并重命名为
copy c:/*.*复制 c:/ 所有⽂件到当前⽬录,不包括隐藏⽂件和系统⽂件不指定⽬标路径,则默认⽬标路径为当前⽬录
copy con 从屏幕上等待输⼊,按 Ctrl+Z 结束输⼊,输⼊内容存为⽂件con代表屏幕,prn代表打印机,nul代表空设备
copy + 合并 和 的内容,保存为 ⽂件如果不指定 ,则保存到
copy +复制⽂件到⾃⼰,实际上是修改了⽂件⽇期
title 新标题 #可以看到cmd窗⼝的标题栏变了
14 label 和 vol设置卷标
vol #显⽰卷标
label #显⽰卷标,同时提⽰输⼊新卷标
label c:system #设置C盘的卷标为 system
md创建⽬录
rd删除⽬录
del删除⽂件
ren⽂件重命名
cls清屏
type显⽰⽂件内容
copy拷贝⽂件
title设置cmd窗⼝的标题
ver显⽰系统版本
pause暂停命令
运⾏该命令时,将显⽰消息:请按任意键继续 . . .,⼀般⽤于看清楚屏幕上显⽰的内容
rem 和 ::注释命令
注释⾏不执⾏操作
date 和 time⽇期和时间
date #显⽰当前⽇期,并提⽰输⼊新⽇期,按"回车"略过输⼊
date/t #只显⽰当前⽇期,不提⽰输⼊新⽇期
time #显⽰当前时间,并提⽰输⼊新时间,按"回车"略过输⼊
time/t #只显⽰当前时间,不提⽰输⼊新时间
:label #⾏⾸为:表⽰该⾏是标签⾏,标签⾏不执⾏操作
goto label #跳转到指定的标签那⼀⾏
find "abc" c:/在 c:/ ⽂件⾥查找含 abc 字符串的⾏如果找不到,将设 errorlevel 返回码为1
find /i "abc" c:/查找含 abc 的⾏,忽略⼤⼩写
find /c "abc" c:/显⽰含 abc 的⾏的⾏数
more c:/ #逐屏显⽰ c:/ 的⽂件内容
tree d:/ #显⽰D盘的⽂件⽬录结构
c: & cd/ & dir /w相当于把下⾯3⾏命令写到1⾏去了c:cd/dir /w
f: && cd/ && dir >c:/注意如果f盘不存在,那么后⾯2条命令将不会执⾏
find "ok" c:/ && echo 成功如果找到了"ok"字样,就显⽰"成功",找不到就不显⽰
find "ok" c:/ || echo 不成功如果找不到"ok"字样,就显⽰"不成功",找到了就不显⽰
goto 和 :跳转命令
find (外部命令)查找命令
more (外部命令)逐屏显⽰
tree显⽰⽬录结构
&顺序执⾏多条命令,⽽不管命令是否执⾏成功
&&顺序执⾏多条命令,当碰到执⾏出错的命令后将不执⾏后⾯的命令
||顺序执⾏多条命令,当碰到执⾏正确的命令后将不执⾏后⾯的命令
|管道命令
前⼀个命令的执⾏结果输出到后⼀个命令
dir *.* /s/a | find /c ".exe"管道命令表⽰先执⾏ dir 命令,对其输出的结果执⾏后⾯的 find 命令该命令⾏结果:
输出当前⽂件夹及所有⼦⽂件夹⾥的.exe⽂件的个数
type c:/|more这个和 more c:/ 的效果是⼀样的
> 和 >>输出重定向命令
> 清除⽂件中原有的内容后再写⼊
>> 追加内容到⽂件末尾,⽽不会清除原有的内容主要将本来显⽰在屏幕上的内容输出到指定⽂件中指定⽂件如果不存在,则⾃动⽣成该⽂
件
echo hello world>c:/ ⽣成c:/⽂件,内容为hello world这个格式在批处理⽂件⾥⽤得很多,可以⽣成.reg .bat .vbs 等临时⽂件
type c:/ >prn 屏幕上不显⽰⽂件内容,转向输出到打印机
echo hello world>con 在屏幕上显⽰hello world,实际上所有输出都是默认 >con 的
copy c:/ f: >nul 拷贝⽂件,并且不显⽰"⽂件复制成功"的提⽰信息,但如果f盘不存在,还是会显⽰出错信息
copy c:/ f: >nul 2>nul 不显⽰"⽂件复制成功"的提⽰信息,并且f盘不存在的话,也不显⽰错误提⽰信息
echo ^^W ^> ^W>c:/ ⽣成的⽂件内容为 ^W > W^ 和 > 是控制命令,要把它们输出到⽂件,必须在前⾯加个 ^符号
< 从⽂件中获得输⼊信息,⽽不是从屏幕上
⼀般⽤于 date time label 等需要等待输⼊的命令,这样就可以不等待输⼊直接修改当前⽇期
@echo off
echo 2005-05-01>
date <
del
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*命令⾏传递给批处理的参数
%0 批处理⽂件本⾝
%1 第⼀个参数
%9 第九个参数
%* 从第⼀个参数开始的所有参数
在C盘根⽬录新建,内容如下:
@echo off
echo %0
echo %1
echo %2
echo %*
运⾏cmd,输⼊ c:/ "/a" /b /c /d,可以看出每个参数的含意 修改内容如下
@echo off
echo %1
echo %~1
echo %0
echo %~f0
echo %~d0
echo %~p0
echo %~n0
echo %~x0
echo %~s0
echo %~a0
echo %~t0
echo %~z0
再运⾏cmd,输⼊ c:/ "/a" /b /c /d可以参照 call/? 或 for/? 看出每个参数的含意,注意这⾥可以对⽂件进⾏⽇期⽐较和⼤⼩⽐较:
echo load "%%1" "%%2">c:/
⽣成的⽂件内容为 load "%1" "%2"批处理⽂件⾥,⽤这个格式把命令⾏参数输出到⽂件
set设置变量
引⽤变量可在变量名前后加 % ,即 %变量名%
set #显⽰⽬前所有可⽤的变量,包括系统变量和⾃定义的变量
echo %SystemDrive% #显⽰系统盘盘符。系统变量可以直接引⽤
set p #显⽰所有以p开头的变量,要是⼀个也没有就设errorlevel=1
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后⾯的字符串,即aa1bb1aa2bb2
echo %p% #显⽰变量p代表的字符串,即aa1bb1aa2bb2
echo %p:~6% #显⽰变量p中第6个字符以后的所有字符,即aa2bb2
echo %p:~6,3% #显⽰第6个字符以后的3个字符,即aa2
echo %p:~0,3% #显⽰前3个字符,即aa1
echo %p:~-2% #显⽰最后⾯的2个字符,即b2
echo %p:~0,-2% #显⽰除了最后2个字符以外的其它字符,即aa1bb1aa2b
echo %p:aa=c% #⽤c替换变量p中所有的aa,即显⽰c1bb1c2bb2
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显⽰1bb12bb2
echo %p:*bb=c% #第⼀个bb及其之前的所有字符被替换为c,即显⽰c1aa2bb2
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
set /a p=39 #设置p为数值型变量,值为39
set /a p=39/10 #⽀持运算符,有⼩数时⽤去尾法,39/10=3.9,去尾得3,p=3set /a p=p/10
#⽤ /a 参数时,在 = 后⾯的变量可以不加%直接引⽤set /a p="1&0"
#"与"运算,要加引号。其它⽀持的运算符参见set/?
set p= #取消p变量
set /p p= 请输⼊屏幕上显⽰"请输⼊",并会将输⼊的字符串赋值给变量p注意这条可以⽤来取代 choice 命令
注意变量在 if 和 for 的复合语句⾥是⼀次性全部替换的,如
@echo off
set p=aaa
if %p%==aaa (
echo %p%
set p=bbb
echo %p% )
结果将显⽰aaaaaa因为在读取 if 语句时已经将所有 %p% 替换为aaa这⾥的"替换",在 /? 帮助⾥就是指"扩充"、"环境变量扩充"可以启⽤"延
缓环境变量扩充",⽤ ! 来引⽤变量,即!变量名!
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set p=aaaif %p%==aaa (
echo %p%
set p=bbb
echo !p! )
ENDLOCAL
结果将显⽰aaabbb 还有⼏个动态变量,运⾏ set 看不到
%CD% #代表当前⽬录的字符串
%DATE% #当前⽇期
%TIME% #当前时间
%RANDOM% #随机整数,介于0~32767
%ERRORLEVEL% #当前ERRORLEVEL 值
%CMDEXTVERSION% #当前命令处理器扩展名版本号
%CMDCMDLINE% #调⽤命令处理器的原始命令⾏可以⽤echo命令查看每个变量值,如 echo %time%
注意 %time%精确到毫秒,在批处理需要延时处理时可以⽤到
start批处理中调⽤外部程序的命令,否则等外部程序完成后才继续执⾏剩下的指令
start explorer d:/调⽤图形界⾯打开D盘
@echo off
cd /d %~dp0
regedit /s 劲舞团.reg
start
不加 start 命令的话,"劲舞团"运⾏时,后⾯会有个⿊乎乎的cmd窗⼝
call批处理中调⽤另外⼀个批处理的命令,否则剩下的批处理指令将不会被执⾏有时有的应⽤程序⽤start调⽤出错的,也可以call调⽤
choice (外部命令)选择命令让⽤户输⼊⼀个字符,从⽽选择运⾏不同的命令,返回码errorlevel为1234……
win98⾥是,win2000pro⾥没有,可以从win98⾥拷过来,win2003⾥是
choice /N /C y /T 5 /D y>nul延时5秒
下⾯是个 choice 语句的例⼦
@echo off
rem 以下在win2000pro运⾏通过,从win98⾥拷的⽂件
choice /c:abc aaa,bbb,ccc
if errorlevel 3 goto ccc
if %errorlevel%==2 goto bbb
if errorlevel==1 goto aaa
rem 必须先判断数值⾼的返回码rem 可以看到 errorlevel 值的判断有3种写法,有时某种写法不好⽤,可以⽤另外的写法
rem 直接运⾏
chioce相当于运⾏
choice /c:yn:aaa
echo aaa
goto end
:bbb
echo bbb
goto end
:ccc
echo ccc
goto end
:end
assoc 和 ftype⽂件关联assoc 设置'⽂件扩展名'关联,关联到'⽂件类型'ftype 设置'⽂件类型'关联,关联到'执⾏程序和参数'当你双击⼀
个.txt⽂件时,windows并不是根据.txt直接判断⽤ 打开⽽是先判断.txt属于 txtfile '⽂件类型'再调⽤ txtfile 关联的命令⾏
txtfile=%SystemRoot%/system32/ %1可以在"⽂件夹选项"→"⽂件类型"⾥修改这2种关联
assoc #显⽰所有'⽂件扩展名'关联
assoc .txt #显⽰.txt代表的'⽂件类型',结果显⽰ .txt=txtfile
assoc .doc #显⽰.doc代表的'⽂件类型',结果显⽰ .doc=nt.8
assoc .exe #显⽰.exe代表的'⽂件类型',结果显⽰ .exe=exefile
ftype #显⽰所有'⽂件类型'关联
ftype exefile #显⽰exefile类型关联的命令⾏,结果显⽰ exefile="%1" %* assoc .txt=nt.8设置.txt为word类型的⽂档,可
以看到.txt⽂件的图标都变了
assoc .txt=txtfile恢复.txt的正确关联 ftype exefile="%1" %*恢复 exefile 的正确关联
如果该关联已经被破坏,可以运⾏ ,再输⼊这条命令
pushd 和 popd切换当前⽬录
@echo off
c: & cd/ & md mp3 #在 C:/ 建⽴ mp3 ⽂件夹
md d:/mp4 #在 D:/ 建⽴ mp4 ⽂件夹
cd /d d:/mp4 #更改当前⽬录为 d:/mp4
pushd c:/mp3 #保存当前⽬录,并切换当前⽬录为 c:/mp3
popd #恢复当前⽬录为刚才保存的 d:/mp4⼀般⽤处不⼤,在当前⽬录名不确定时,会有点帮助
subst z: //server/d #这样输⼊z:就可以访问//server/d了
subst z: /d #取消该映射
subst #显⽰⽬前所有的映
subst (外部命令)映射磁盘。
xcopy (外部命令)⽂件拷贝
xcopy d:/mp3 e:/mp3 /s/e/i/y
复制 d:/mp3 ⽂件夹、所有⼦⽂件夹和⽂件到 e:/,覆盖已有⽂件,加 /i 表⽰如果 e:/ 没有 mp3 ⽂件夹就⾃动新建⼀个,否则会有询问
39 ⼀些不常⽤的内部命令
>& 将⼀个句柄的输出写⼊到另⼀个句柄的输⼊中
<& 从⼀个句柄读取输⼊并将其写⼊到另⼀个句柄输出中
shift 命令⾏传递给批处理的参数不⽌9个时,⽤以切换参数
color 设置cmd窗⼝的显⽰颜⾊
pormpt 更改命令提⽰符号,默认都是 盘符:/路径/> ,如 c:/>
format (外部命令)格式化硬盘
format c: /q/u/autotest/,q表⽰快速格式化,/autotest表⽰⾃动格式化,不需要按 Y 确认,/u表⽰每字节⽤F6覆盖硬盘数据,使其不可⽤软件
恢复
format c: /c格式化C盘,并检测坏道
fdisk (外部命令)硬盘分区win2000不带该命令win98⾥的fdisk不⽀持80G以上⼤硬盘,winme⾥的⽀持fdisk/mbr重建硬盘分区表,⼀般
⽤于清除引导区病毒、还原精灵注意使⽤该命令不能从硬盘启动,必须软驱或光驱启动后直接运⾏
ping (外部命令)
ping -l 65500 -t 192.168.1.200不停的向192.168.1.200计算机发送⼤⼩为65500byte的数据包
ping -n 10 127.0.0.1>nulping⾃⼰10次,可⽤于批处理延时10秒
SC (外部命令)服务控制命令
sc create aaa displayname= bbb start= auto binpath= "C:/WINDOWS/System32/"创建服务,服务名称aaa,显⽰名称bbb,启
动类型:⾃动可执⾏⽂件的路径"C:/WINDOWS/System32/"
sc description aaa "ccc"更改aaa的描述为ccc
sc config aaa start= disabled binpath= "C:/WINDOWS/System32/ -k netsvcs"更改aaa的启动类型:已禁⽤更改aaa的可执⾏
⽂件的路径"C:/WINDOWS/System32/ -k netsvcs"
sc config aaa start= demand displayname= ddd更改aaa的启动类型:⼿动更改aaa的显⽰名称ddd
sc start aaa启动aaa服务
sc stop aaa停⽌aaa服务
sc delete aaa删除aaa服务
----------------------------------------------------------------------------------
批处理命令获取当前盘符和当前⽬录
%~d0 是当前盘符
%cd% 是当前⽬录
可以⽤echo %cd%进⾏打印测试
通过批处理取当前⽬录的上⼀级⽬录
@echo off
if %cd%==%cd:~,3% echo 当前⽬录已经是%cd:~,1%盘的根⽬录!&goto end
cd..
set "bd=%cd%"
cd..
set "bbd=%cd%"
if "%bbd%"=="%bd%" (echo 上⼀级⽬录是: %cd:~,1%盘的根⽬录!
) else call echo 上⼀级⽬录是: "%%bd:%bbd%=%%"
:end
pause


发布评论