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

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

本帖最后由 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或许是被预处理之后直接就扩展了,,可能根本没机会延迟
1

评分人数

本帖最后由 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
复制代码

TOP

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

回复 2# pcl_test

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

然而。。set那一步%1就被扩展了。。。setlocal enabledelayedexpansion对%1好像没用啊。。。

TOP

回复 3# ldl383

那你告诉我%1指向的是%windir%还是C:\Windows?(假设系统在C盘)

TOP

回复 4# pcl_test


  指向%windir%而不是它的值

TOP

回复 5# ldl383

然而批处理预处理后却是C:\Windows,不是%windir%,所以你说该怎么办?
1

评分人数

    • ldl383: 原来如此。我还以为%1等参数都是直接传过去 ...技术 + 1

TOP

回复 6# pcl_test


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

TOP

返回列表