| 
 
qdcr 
初级用户
 
  
 
  
  
积分 120 
发帖 32 
注册 2006-6-19 
状态 离线
 | 
『楼 主』:
 问个EnableDelayedExpansion的问题
 
使用 LLM 解释/回答一下
  
setlocal EnableDelayedExpansion 
for /f "delims=" %%i in ('"dir /ad /s /b /on *.*"') do ( 
    set file=%%~fi 
    set file=!file:%cd%\=! 
    set file=!file:/=\! 
    echo The directory name is  !file! 
    ) 
上诉代码可以输出当前目录下所有文件夹相对于当前目录的相对路径。 
 
但是,EnableDelayedExpansion并不是所有的dos都能支持,请问如果不使用延迟扩展的话,如何修改上诉代码? 
 
    
 
  
 |   
 | 
  2006-7-4 23:14 | 
  
 | 
 | 
 
feifei0000 
初级用户
 
  
 
  
  
积分 42 
发帖 11 
注册 2006-1-7 
状态 离线
 | 
『第 2 楼』:
 
 
使用 LLM 解释/回答一下
  
set file=!file:%cd%\=! 
有什么用,我不理解,而且我删除这语句,对结果没什么影响啊? 
 
    
 
  
 |   
 | 
  2006-7-8 19:00 | 
  
 | 
 | 
 
无奈何 
荣誉版主
 
       
 
  
  
积分 1338 
发帖 356 
注册 2005-7-15 
状态 离线
 | 
『第 3 楼』:
 
 
使用 LLM 解释/回答一下
  
Re qdcr 
这段代码并不是 dos 批处理,而只能运行于 CMD 下的代码,setlocal  的EnableDelayedExpansion 选项好像是 NT 以上系统都支持。如过确实想取消延迟环境变量的话,可以作以下更改:
  
 
- @echo off
 
 - for /f "delims=" %%i in ('"dir /ad /s /b /on *.*"') do (
 
 - 	call :directory %%~fi
 
 - 	)
 
 - goto :EOF
 
 - :directory
 
 - 	set file=%*
 
 - 	call set file=%%file:%cd%\=%%
 
 - 	set file=%file:/=\%
 
 - 	echo The directory name is  %file%
 
 - goto :EOF
 
  	无奈何贴于    2006-07-08  19:27 
 
Re feifei0000
 
set file=!file:%cd%\=! 
一句的作用是删除完整路径中的 %cd% 部分,基于语句分析的话就是将 %cd% 部分替换为空。 
例如: 
file=c:\test\AAA\BBB 
%cd%=c:\test 
执行后 file=AAA\BBB  
 
    
 
  
  |  
                  
  
                      ☆开始\运行 (WIN+R)☆ 
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul 
 
 |   
 | 
  2006-7-8 19:43 | 
  
 | 
 | 
 
feifei0000 
初级用户
 
  
 
  
  
积分 42 
发帖 11 
注册 2006-1-7 
状态 离线
 | 
『第 4 楼』:
 
 
使用 LLM 解释/回答一下
  
回复 无奈何  
我按照 qdcr的代码,并没有达到你说的效果(file=c:\test\AAA\BBB %cd%=c:\test 
执行后 file=AAA\BBB) 我是在C盘根目录下运行qdcr的代码,结果如下(其中的一部分): 
The directory name is  C:\Program Files\TianCity\PopKart 
The directory name is  C:\Program Files\TianCity\PopKart\M01 
The directory name is  C:\Program Files\TianCity\PopKart\M01\Data 
The directory name is  C:\Program Files\TianCity\PopKart\M01\NMDATA 
The directory name is  C:\Program Files\TTPlayer\AddIn 
The directory name is  C:\Program Files\TTPlayer\Lyrics 
The directory name is  C:\Program Files\TTPlayer\PlayList 
The directory name is  C:\Program Files\TTPlayer\Profile .......... 
 
 
并没有得到file=TianCity\PopKart   flie=TTPlayer\Profile等这样的效果啊 
 
    
 
  
 |   
 | 
  2006-7-8 20:23 | 
  
 | 
 | 
 
feifei0000 
初级用户
 
  
 
  
  
积分 42 
发帖 11 
注册 2006-1-7 
状态 离线
 | 
『第 5 楼』:
 
 
使用 LLM 解释/回答一下
  
还有请问一下,call 标号 变量  
这个概念我不是很清楚,比如上面的call directory %%~fi 
我觉得得到高手的指点,我实在是很荣幸啊!! 
 
    
 
  
 |   
 | 
  2006-7-8 20:28 | 
  
 | 
 | 
 
feifei0000 
初级用户
 
  
 
  
  
积分 42 
发帖 11 
注册 2006-1-7 
状态 离线
 | 
『第 6 楼』:
 
 
使用 LLM 解释/回答一下
  
搞错了啊,不好意思啊,原来我是在C盘根目录下,原来那些代码主要是在其他目录下,而不是根目录下啊 
 
    
 
  
 |   
 | 
  2006-7-8 20:37 | 
  
 | 
 | 
 
无奈何 
荣誉版主
 
       
 
  
  
积分 1338 
发帖 356 
注册 2005-7-15 
状态 离线
 | 
『第 7 楼』:
 
 
使用 LLM 解释/回答一下
  
Re: feifei0000 
	关于 call 标号 参数  这类的用法可以看做类似于高级语言的函数调用。具体到我3楼的帖子可以将 :directory 当作一个函数执行功能调用,关于参数可以用 %1 %2 %*...来引用,其中 %* 代表所有参数。 
	建议你读一下这篇英文文章,亲自调试一下文章中给出的代码示例,相信应该会有更深刻的认识的。链接: http://www.commandline.co.uk/lib/Batch%20Function%20Library/01_Introduction/3_Batch%20Functions%20Explained.html 
 
    
 
  
  |  
                  
  
                      ☆开始\运行 (WIN+R)☆ 
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul 
 
 |   
 | 
  2006-7-8 22:40 | 
  
 | 
 | 
 
doscc 
中级用户
 
   
 
  
 
积分 256 
发帖 93 
注册 2006-3-26 来自 广东 
状态 离线
 | 
 | 
  2006-7-9 03:53 | 
  
 |