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

[系统相关] [讨论]分离%path%路径的一段批处理

  曾经在CN-DOS上看到ansipeter同志(曾用马甲:9527、bigpipe)发表的一段代码,可以很方便地分离出%path%中的每一条路径,揣摩良久,不得其解,发布在此,望各位能详加探讨其中奥妙:
  1. for %a in ("%path:;=" "%") do @echo %~a
复制代码
  原帖出处:http://www.cn-dos.net/forum/viewthread.php?tid=38347
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

上面列出的内容可以输出到文本文件吗?

TOP

回复 17楼 的帖子

提示“最大递归层错误”是连续运行setlocal 32次,而非endlocal
其实12楼的代码完全可以取消if语句,直接endlocal就可以,不过感觉多余^_^
而且反复运行endlocal语句,始终感觉不太“健康”
  1. setlocal enabledelayedexpansion
  2. for %%a in ("!path:;=" "!") do (
  3.     endlocal
  4.     echo %%~a
  5. )
  6. pause
复制代码
技术问题请到论坛发帖求助!

TOP

  在for前开,在for内关,开关的次数没有一一对应,竟然也不会出现“已达最大递归层”的错误,有点意外,我有点糊涂了,哪位来分析一下,说不定又会有新的突破^_^。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

re 14 楼
#@#是一个不存在的变量,如是开启了变量延迟,就会替换为空了,否则就是!#@#!

TOP

测试过了,可以呀,
if "!#@#!" equ "" endlocal
是为了判断是否开启了变量延迟的(要保证不存在#@#变量)

我知道是要一一对应的,且可以在for 之前开启,在for内关闭,并不一定要在一个for内开就得在该for内关的,只要能做到一一对应就可以了。

在for前开,在for内关,有时会有意想不到的效果哦。

TOP

  尝试把if语句去掉,直接endlocal,发现代码也能正确执行,有点匪夷所思——我有点奇怪 "!#@#!"  的来历:为什么是这么一串突兀的字符串呢?能说说理由吗?
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

  netbenton兄12楼的代码测试过了吗?我实地测试了一下,修改之前的代码,执行结果显示的是"echo 处于关闭状态"的报错信息。

  另外,在for内,启用了变量延迟后,可以在合适的位置用endlocal来中止,就可以避免!被抛弃的问题,但是,这个合适的位置在什么地方呢?我认为,应当满足以下条件:
  1、setlocal和endlocal要配对使用:开启一次之后,再关闭;关闭之后,在进入for的下一次内部循环时,再开启一次,结束之时再关闭,但一定要保证开关的次数要对应;
  2、setlocal可以在for语句之前,也可以包含在for语句中,但是,一定要保证它们开关的次数要对应。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

可以在for内把变量延迟关掉就不会丢了
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in ("!path:;=" "!") do (
  3.     if "!#@#!" equ "" endlocal
  4.     echo %%~a
  5. )
复制代码

[ 本帖最后由 netbenton 于 2009-5-18 23:08 编辑 ]

TOP

  开启了变量延迟后再用!来代替%,往往会造成原有的!丢失,请看这篇文章:最大限度原样输出含特殊符号的指定行内容:http://bbs.bathome.net/viewthread.php?tid=4580
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

开启变量延迟后,用!号代替%号,就可以解决多个特殊符号问题了

TOP

回复 7楼 的帖子

C:\Test>test.bat
C:\BatHome\Batcher&namejm
C:\BatHome\Batcher namejm

C:\Test>type test.bat
@echo off
set "mypath=C:\BatHome\Batcher&namejm;C:\BatHome\Batcher namejm"
for %%a in ("%mypath:;=" "%") do (
  echo %%~a
)
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 5楼 的帖子

3楼已经提到空格问题了
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

原帖由 tireless 于 2009-5-18 22:38 发表
直接 for %a in (%path%) do echo %a 可以分出来。括号里面的分隔符可以是 ; , =

  碰上带空格的路径就会出错,还是顶楼的代码比较保险——当然,顶楼的代码也不能兼容带&的路径,不过,在实际使用中,是可以通过一些技巧避免掉的。

—————————————————————————————————————————————————————————
  红色部分是错误的结论,实际上,顶楼的代码可以兼容带&的路径,请看以下楼层中batcher的演示。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

  惭愧,没仔细看那个帖子的所有讨论,错过了领会其中奥妙的大好时机。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

返回列表