批处理学习start、call、cmd篇

之所以放在一起,是因为这三个命令的功能有所交集
1、start
@echo off
%1 cd.>tmp
set /p=%1 %1 start /b "" %0 :(五秒后退出) tm
if not "%1"=="" goto %1
set /p n=输入任意字符
if defined n (
del tmp
echo 您输入的是%n%,五秒后退出。
) else echo 输入为空!五秒后退出。
:(五秒后退出)
ping /n 5 localhost>nul
if exist %2p exit
pause::妙用start /b让set /p实现choice的延时功能,不知道哪位前辈首创的,再次赞一个。此处%1、%2

的技巧仅作点缀,我只是觉得这样“搭积木”很好玩才强加上去的
复制代码
2、call
set a=b
set b=c
call echo %%%a%%%
::不使用变量延迟仍然可以借助call实现变量的延迟读取与嵌套,但是效率上有缺陷
复制代码
3、cmd
set a=b
set b=c
cmd /c echo %%%a%%%
::这证明call一个命令时的效果近似于cmd /c,二者的区别体现在"for"和"if"这两个命令不能用call运行

,因为for和if其实可能只是关键字,而非真实存在的命令
复制代码
set a=b
set b=c
cmd /v:on /c echo !%a%!
::不需要setlocal,照样可以使用变量延迟
复制代码
%1 %0 :: echo;成功调用自身
%2
::个人很常用,这里用%1和%2的技巧为我所偏爱,那个::可以视情况换为rem。虽然此处并未出现cmd命令,

但其实运行自身时执行的就是cmd /c %0。
复制代码
@echo off
%1 cmd /v:on /c %0 ::
set n=123
echo !n!
pause
::综合前两个技巧实现不使用setlocal,开启变量延迟
复制代码
@echo off
set str=test测试1234
setlocal enabledelayedexpansion
for /f "delims=:; " %%a in ('((cmd /u /c echo !str!^)^&echo^;^;^)^|findstr /o ^;') do set /a

n=%%a-5
for /f "delims=:" %%a in ('((echo !str!^)^&echo^;^;^)^|findstr /o ^;') do set /a d=n-%%a+3
set /a m=n/2,s=m-d
echo 共!m!个字符,!d!个单字节字符、!s!个双字节字符
pause
::三步判断单字符、双字符个数的另类办法。优势在于支持对超长字符串进行计算(此时用常规算法步骤多且难通用),缺点在于效率低。
复制代码
ren 1.exe 1.bat
echo 请双击1.bat
::为什么这样也可以运行呢?因为exe的打开方式是"%1" %*,bat是cmd /c "%1" %*,所以把exe当做bat运 行时,相当于cmd /c 1.exe...不过这只适合双击打开,在cmd内部调用此文件的时候是当成真正的bat运行的,所以会出错。

  1. da shang
    donate-alipay
               donate-weixin weixinpay

发表评论↓↓