Board logo

标题: [其他] 【已解决】批处理如何才能使参数中存在的环境变量不被提前扩展? [打印本页]

作者: ldl383    时间: 2016-1-18 12:45     标题: 【已解决】批处理如何才能使参数中存在的环境变量不被提前扩展?

本帖最后由 ldl383 于 2016-1-18 19:39 编辑

批处理的参数——%1、%0等如何处理?
  1. @echo off
  2. set "par1=%~f1"
  3. setlocal enabledelayedexpansion
  4. echo !par1!
  5. pause
复制代码
这个虽然可以处理特殊字符,但是由于某些变量的优先级
比如%1的内容为%windir%xx^^&^^&xx.xxx
在引号里由于%windir%的优先级还是被提前扩展了。。。
所以赋给par1的值为"C:\Windowsxx^^&^^&xx.xxx"(没引号,不一定是C盘)
但是利用:
for /f "delims==" %%i in ('set') do (set %%i=)
来将这些变量赋空也没用。。。

所以,问题就是如何将%1等参数变量延迟?


不算完全解决。%1或许是被预处理之后直接就扩展了,,可能根本没机会延迟
作者: pcl_test    时间: 2016-1-18 14:39

本帖最后由 pcl_test 于 2016-1-18 14:43 编辑

栗子
  1. @echo off
  2. call :a "%%%%windir%%%%"
  3. pause&exit
  4. :a
  5. set "str=%~1"
  6. echo;%str%
  7. call echo;%str%
复制代码
  1. @echo off
  2. rem xxx.bat "^%windir^%"
  3. set "str=%~1"
  4. echo;%str%
  5. call echo;%str%
  6. pause
复制代码

作者: ldl383    时间: 2016-1-18 15:33

本帖最后由 ldl383 于 2016-1-18 15:37 编辑

回复 2# pcl_test

虽然说可以。。但是不是这样的,,传给批处理的参数必须是“%windir%xx^^&^^&xx.xxx”(没引号)

然而。。set那一步%1就被扩展了。。。setlocal enabledelayedexpansion对%1好像没用啊。。。
作者: pcl_test    时间: 2016-1-18 16:50

回复 3# ldl383

那你告诉我%1指向的是%windir%还是C:\Windows?(假设系统在C盘)
作者: ldl383    时间: 2016-1-18 17:16

回复 4# pcl_test


  指向%windir%而不是它的值
作者: pcl_test    时间: 2016-1-18 18:00

回复 5# ldl383

然而批处理预处理后却是C:\Windows,不是%windir%,所以你说该怎么办?
作者: ldl383    时间: 2016-1-18 19:33

回复 6# pcl_test


    如果是这样就只能对%cmdcmdline%下手了。。。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2