本帖最后由 zzpsongs 于 2012-8-6 15:06 编辑
我今天发现 pushd和popd指令还受变量延迟的影响
比如v目录的v.bat文件内的代码是- pushd %~dp0
- md tesst1
- cd tesst1
- md tesst2
- cd tesst2
- setlocal enabledelayedexpansion
- cd \
- popd
- popd
- popd
- popd
复制代码 然后打开cmd,以v目录所在的目录为工作目录,对v\v.bat 进行call指令复制代码 可以看到,不管popd了几次,最终目录都会是setlocal前所cd的目录,而不是初衷的v目录所在的目录
解决办法是在popd之前进行endlocal,比如:- pushd %~dp0
- md tesst1
- cd tesst1
- md tesst2
- cd tesst2
- setlocal enabledelayedexpansion
- cd \
- endlocal
- popd
- popd
- popd
- popd
复制代码 如果有错误,还请达人们指教~~
我上面的操作过程写得有点繁琐,我来个一次性的代码吧:- @echo off
- set a=tess2
- echo 调用前的工作目录(初始目录)是%~dp0
- ::接下来配置实验环境,可无视
- md yy>nul 2>nul
- >show.txt echo 现在的工作目录是yy目录“%~dp0yy”,不是初始目录,请尝试修改%a%.bat,在popd前插入endlocal语句,保存后再重新执行本批处理
- move show.txt yy>nul
- >show.txt echo 现在的工作目录是初始目录”%~dp0”,现在popd的效果正是所预期的
- if not exist %a%.bat (
- >%a%.bat (
- echo pushd %%~dp0
- echo cd yy
- echo setlocal enabledelayedexpansion
- echo.
- echo popd
- )
- )
- ::以上为实验环境配置,可无视
- echo 调用初始目录下的%a%.bat (pushd → cd yy → popd)
- call %a%.bat
- ::调用%a%.bat后,若显示初始目录,那就对了;若显示yy目录,那么popd就失去初衷了
- echo %a%.bat执行结束
- echo 调用结束后,执行type show.txt,结果是:
- echo.
- type show.txt
- echo.
- pause
复制代码
|