[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] [已解决]call setlocal enabledelayedexpansion里生成的变量无法返回值

本帖最后由 yunyan100 于 2017-12-28 23:37 编辑

rt,是这样的,call下面的时候有一个变量pa,是路径,通过下面这段代码,将这段路径进行修改,我用got :eof(知它不传值)返回的话,pa这个值没有变,所以我用call回去,这个pa的值才变了,所以请问下各位,pa这个量我明明有改,但回去的时候怎么还是传来之前的量(包括在这里生成的新变量也无)?
  1. setlocal enabledelayedexpansion
  2. set "src=%patt%\"&set "dst="
  3. for /f "delims=" %%a in ("%pa%") do ( set "str=%%a"&set "pa=!str:%src%=%dst%!")
  4. setlocal disabledelayedexpansion
  5. call %1 "%pa%"
复制代码

>setlocal /?

开始批处理文件中环境改动的本地化操作。在执行 SETLOCAL 之后
所做的环境改动只限于批处理文件。要还原原先的设置,必须执
行 ENDLOCAL。达到批处理文件结尾时,对于该批处理文件的每个
尚未执行的 SETLOCAL 命令,都会有一个隐含的 ENDLOCAL 被执行

还有你在call什么?

尽管这样,利用预处理机制也可以传回变量
  1. call :test "%pa%"
  2. goto :eof
  3. :test
  4. set "src=%patt%\"&set "dst="
  5. setlocal enabledelayedexpansion
  6. for /f "delims=" %%a in ("%pa%") do (
  7.   set "str=%%a"
  8.   set "pa=!str:%src%=%dst%!"
  9. )
  10. endlocal&set "str=%str%"&set "pa=%pa%"
  11. goto :eof
复制代码

TOP

本帖最后由 yunyan100 于 2017-12-28 23:18 编辑

回复 2# 0000


    首先非常感谢你,按你的成功了,因为setlocal disabledelayedexpansion这句是结束延时,所以我这是这句,你发出来的是endlocal 且重设置下变量(这才是关键吗),难道就是这两个的原因?因为不禁止setlocal enabledelayedexpansion这东西,会影响后面的变量, 所以我一直用的是setlocal disabledelayedexpansion,非常感谢
  1. call :ltty
  2. set runexe=%pa%&set ne=%pax%&set name=%pay%
复制代码
  1. :ltty
  2. ::下级文件夹路径修改
  3. set "src=%patt%\"&set "dst="
  4. setlocal enabledelayedexpansion
  5. for /f "delims=" %%a in ("%pa%") do (set "str=%%a"&set "pax=%%~na"&set "pay=%%~nxa"&set "pa=!str:%src%=%dst%!")
  6. endlocal&set "pax=%pax%"&set "pay=%pay%"&set "pa=%pa%"
  7. goto :eof
复制代码

TOP

返回列表