找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 25306|回复: 6

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

[复制链接]
发表于 2016-1-18 12:45:34 | 显示全部楼层 |阅读模式
本帖最后由 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或许是被预处理之后直接就扩展了,,可能根本没机会延迟

评分

参与人数 1PB -4 收起 理由
pcl_test -4 勿发笼统的标题

查看全部评分

发表于 2016-1-18 14:39:58 | 显示全部楼层
本帖最后由 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
复制代码
 楼主| 发表于 2016-1-18 15:33:45 | 显示全部楼层
本帖最后由 ldl383 于 2016-1-18 15:37 编辑

回复 2# pcl_test

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

然而。。set那一步%1就被扩展了。。。setlocal enabledelayedexpansion对%1好像没用啊。。。
发表于 2016-1-18 16:50:27 | 显示全部楼层
回复 3# ldl383

那你告诉我%1指向的是%windir%还是C:\Windows?(假设系统在C盘)
 楼主| 发表于 2016-1-18 17:16:30 | 显示全部楼层
回复 4# pcl_test


  指向%windir%而不是它的值
发表于 2016-1-18 18:00:07 | 显示全部楼层
回复 5# ldl383

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

评分

参与人数 1技术 +1 收起 理由
ldl383 + 1 原来如此。我还以为%1等参数都是直接传过去 ...

查看全部评分

 楼主| 发表于 2016-1-18 19:33:48 | 显示全部楼层
回复 6# pcl_test


    如果是这样就只能对%cmdcmdline%下手了。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 03:08 , Processed in 0.022103 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表