批处理学习start、call、cmd 篇

四、start、call、cmd 篇 
        之所以放在一起,是因为这三个命令的功能有所交集 
1、start 
@echo off 
%1 cd.>tmp 
set /p=%1<nul 
%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运行的,所以会出错。 

转载于:https://my.oschina.net/ypimgt/blog/61723

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值