Windows bat 学习(高级)

  • 有一种叫做 Command Processor Extensions 的东西,即命令处理器扩展。他会使命令更加高级,功能更多。

在 cmd 里可以使用 ECHO %CMDEXTVERSION% 查看当前版本。

 

  • 在 cmd.exe 控制台窗口中输入命令,跟在 Windows Explorer 中双击 bat 执行相同的命令,其表现是不一样的。
  • 双击 bat 等同于把 bat 的内容 cmd 里一行一行命令敲进去(多行的命令在cmd里并不好敲)

 

  • 若要学习各个命令的详细文档,可在 cmd 中输入例如 SET /? > SET.txt 保存到文本文件中再打开阅读,这样比较方便。在 cmd 中如果文本太长他会逐步显示,比较麻烦,也不能用鼠标选中或者查找。
  • 变量延迟展开(Delayed environment variable expansion)

(SET /? 中有详细说明)

cmd 里的变量都是“环境变量”,通常是先 SET,再使用 %var% 这样的形式使用。%var% 是在读取当前命令时展开的。这是什么意思?

 

1     set VAR=before
2     if "%VAR%" == "before" (
3         set VAR=after
4         if "%VAR%" == "after" @echo If you see this, it worked
5     )

第4行永远不会打印。因为第4行的 %VAR% 在第2行命令“读取”时,已经被展开,即 before。第3行的赋值已经不可能影响第4行了。我猜是因为第4行是在第2行的if 里面的,在读取第2行时,第4行也读取了,所以就被展开了。

跟C++对比,命令行里的 “环境变量” 实际是介于 “真变量” 和 “宏变量” 之间的东西。

“延迟变量展开” 的意思是基本上就是把 “环境变量” 变为 “真变量”。

要改成这么写:!VAR!

set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "!VAR!" == "after" @echo If you see this, it worked
    )

如何开启 “延迟变量展开”?

This support is always disabled by default, but may be enabled/disabled via the /V command line switch to CMD.EXE.  See CMD /?

 

  • 环境变量字符串替换
SET foo=helloworld
ECHO %foo:hello=% // world ECHO
%foo:hello=love% // loveworld
  • 环境变量子字符串
SET foo=helloworld

// 前面是起始索引,后面是长度
ECHO %foo:~0,1%  // h,index=0, length=1
ECHO %foo:~-2%    // ld,意思是 index=-2=length(helloworld)-2=8, length未指定就是指取到最后面
ECHO %foo:0,-1%   // helloworl, 意思是 index=0, length=length(helloworld)-1=9

 

posted on 2017-04-13 15:34  AnswerWinner  阅读(406)  评论(0编辑  收藏  举报

导航