一、 Set 命令
回顾一下set 命令有两个参数
1 /a 直接设置了一个变量或者变量表达式,比如:
Set /a var=2; 或者 set /a var+=2;
2 /p 设置一个变量,这个变量来自用户的命令行的输入结果
Set /p num=请选择要执行的操作
If %num% == “1” (
……
)
二 案列
2.1 批量更改文件名
@echo off
echo Ready for updaing file name......
set extension=.rar
set /a sum=0
for %%m in (*) do (
if not"%%m" == "updateFileName.bat" (
ren %%m%%m%extension%
set /a sum+=1
)
)
echo finished update file name. there has%sum% files wereupdated!
set sum=
set extension=
pause
注意:ren 命令是重新命名文件的命令
2.2 循环执行命令
@echo off
echo test ping the host 192.168.3.115......
:again
ping 192.168.3.115 > nul rem > nul don't show themessage
if not %errorlevel% != 0 GOTO again
start "could connect to host" echo success toconnect host 192.168.3.115
2.3 当前路径 (%cd% vs %~dp0)
%cd%: 可以用在批处理文件中,也可以用在命令行中; 其内容为命令的执行路径或批处理文件的执行路径. 也就是我在E盘执行一个d盘的批处理文件, %cd% 显示的还是E盘,并非D盘
%~dp0:只能用于批处理文件中,它打印的只是批处理文件所在的位置,而与在什么位置执行这个文件没有关系,所以我在E盘执行D盘的批处理文件,那么他的显示结果是D盘
@echo off
echo %%cd%%: %cd%
echo %%~dp0%: %~dp0
pause
E:\script_bench>printPath.bat
%cd%: E:\script_bench
%~dp0: E:\script_bench\
'puase' is not recognized as an internal orexternal command,
operable program or batch file.
E:\script_bench>d:
D:\>E:\script_bench\printPath.bat
%cd%: D:\
%~dp0: E:\script_bench\
2.4 将文件名自动更新为当前系统日期
@echo off
if not exist %1 (
echo required filenot exist, please check you file
goto end
)
rem %1: 被修改的文件名 ~x:得到变量的扩展名 %~x1:表示%1 文件的扩展名
set extension=%~x1
rem date/T 01/16/2016 Sat
for /f "tokens=1-3 delims=/- " %%c in ('date/T') do(
rem 如果在for循环初始变量能确定,以及循环次数能确定,那么连续的几个变量是有效的比如这里的cd e
set date=%%c%%d%%e
)
ren %1 %date%%extension%
echo.
echo file: %1 has been updated to %date%%extension%
set extension=
set date=
:end
echo done
pause
2.5 批处理程序中不同盘符路径的切换
这个是很有用的,比如有时候我们想切换到某个盘符路径下执行某个批处理文件,这时候这个可以派上用场
@echo off
echo.
echo 从当前盘符切换到E:\script_bench\files
pushd E:\script_bench\files
echo 当前路径:%cd%
echo 当前路径包含以下文件夹:
dir/ad/b
echo.
echo 执行打包bat
call updateFileName.bat
echo 返回批处理运行时所在的盘符及路径
popd
pause
pushd 要切换的路径
popd:返回最近一次执行pushd命令之间的路径,这样可以避免更改当前的工作路径
dir: /a 展示带有指定属性的文件d属性,表示只显示文件夹 /b 以见简洁的方式显示,详情请查阅dir/?
2.6 计算当前目录以及子目录所占的硬盘空间
@echo off
echo computing the space of current directory......
echo **********************************************
for /f "tokens=*" %%a in ('dir') do (
echo"%%a"|find" files" > nul && for /f"tokens=3*" %%b in ("%%a") do (
echo currentdirecotry space: %%b%%c
)
)
echo **********************************************
echo computing the space of child direcotry........
for /f %%a in ('dir/ad/s/b') do (
for /f"tokens=*" %%b in ('"dir %%a\"') do (
echo"%%b"\find" files" > nul for /f "tokens=3*"%%c in ('%%b') do (
echo%%a: %%c%%d
)
)
)
echo end of computing
Note:
假如执行一个命令,但是不想在屏幕里看到这个命令的执行情况,可以使用"[命令]>nul"就可以屏蔽命令在屏幕上的输出,但是有的命令执行会出错,即使用了">nul"也不能屏蔽命令产生的信息,所以就在后面加" 2>nul"这个,就是"[命令]>nul+空格+2>nul",这样,不管命令是否正确的运行,都不会在屏幕看到这个命令所产生的屏幕显示了。
用"dir"命令可以显示当前目录的文件及文件夹列表,这时如果用"dir>nul",就看不见dir命令执行的屏幕输出了,那么再键入"dirr"时会显示" 'dirr' 不是内部命令,也不是外部命令,也不是批处理文件。",这时如果用"dirr>nul"来屏蔽这个错误,因为依然会出现" 'dirr' 不是内部命令,也不是外部命令,也不是批处理文件。"这个错误提示,这时如果用"dirr>nul 2>nul"的话,就在屏幕上看不到上面的出错提示了
2.7 删除目录下的空文件
@echo off
for /f "tokens=*" %%a in ('dir /b /ad /s^|sort /r') do rd"%%a" 2>nul
echo
pause
^: 表示后面的字符只是普通的字符,不具有任何特殊含义
2.8 创建一个空文件
cd.> empty.txt
cd. 没有任何输出