[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
管道惹的祸,管道有一个特性,当它所连接的内容中存在语块或内部命令时,将在新的 cmd 进程中执行这部分的命令,新 cmd 进程不属于脚本的一部分,它的运行环境类似于命令行窗口(和 bat 有所不同),其特性之一就是无法用 setlocal 开启本地化操作,而且也无法调用标签。
解决方案有两个,调用自身并获取输出、临时文件中转

TOP

本帖最后由 CrLf 于 2011-8-19 20:14 编辑
  1. cmd /v /c for /f "delims==" %%a in ('set') do echo %%a:!%%a!|sort
复制代码

TOP

回复 6# cjiabing


    去请教了一下万能的寒夜版主,现在终于搞明白了,endlocal 必须和 setlocal 在一层中,call :test 就好比调用一个“子进程”,这个“子进程”继承了“父进程”的环境,但是本身并不存在 setlocal,所以在标签中 endlocal 只能和标签中的 setlocal 相互作用,做个试验就明白了:
  1. @echo off
  2. :test
  3. set /a n+=1
  4. echo %n%
  5. setlocal enabledelayedexpansion
  6. if %n%==33 echo setlocal 上限 32 层,若递归到 32 层以上仍不出错,则证明不同级的 setlocal 相互独立&pause
  7. call :test
复制代码
以前也没注意过,现在才知道有这回事...

TOP

返回列表