中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-08-03 09:56
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 如何获取路径最后一个"\"后的字串[完美解决] 查看 2,607 回复 25
16 发表于 2007-02-13 22:35 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,179
发帖 442
注册 2006-09-09 22:47
19年会员
UID 62249
状态 离线
Originally posted by HUNRYBECKY at 2007-2-13 04:20:

─────────────────── 版务记录 ────────────────────
执行:namejm
说明:{tid=27658}与本主 ...



谢谢处罚,因为当时比较急,又要放假了,想在放假前做处理,放假后可能很少上网,不是很方便,所以发多个帖子以加快回答的速度.我以后会记住的.
17 发表于 2007-02-13 22:57 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,179
发帖 442
注册 2006-09-09 22:47
19年会员
UID 62249
状态 离线
再问下高手门一个问题:我想在下面的批处理IME.BAT中根据用户的选择IME.SVE来决定删除和备份那些输入法,但是遇到一个问题:
ime\IMJP8_1
system32\imjp81.ime
system32\imjp81k.dll
system32\kbdjpn.dll
system32\msir3jp.dll
system32\msir3jp.lex
ime\IMJP8_1是文件夹,表示日文输入,后面几个是日文输入的几个关联文件,我备份时要同时把该目录和其他几个关联文件一起压缩到一文件夹命名如IMJP8_1中,如何做到?因为这里有三个难点:一是在路径层次不确定的情况下如何以文件夹的最后一个\名称来命名,问题已经由12楼的ZH159兄解决,二是如果区分判断IME.SVE中所列是文件夹还是文件,我使用FINDSTR+扩展名判断,还是有点问题;三是如何根据第二个难点的判断把文件压缩添加到相应的压缩包中?

可能我的描述不是很清楚,表达能力不好,见谅,见下面的代码
批处理IME.BAT的内容

@ECHO OFF
SET PATH=%CD%;%CD%\TOOLS\;%PATH%

IF NOT EXIST BACKUP\IME MD BACKUP\IME
FOR /F "EOL=;DELIMS=" %%I IN ('FINDSTR /I/V ".ime .mb .lex .tbl .hlp .cnt .dll" .\Purge\IME.SVE') DO (
ECHO 正在压缩备份输入法%windir%\%%I\下的文件,请稍等......
PING 127.0.0.1 -n %TIMEOUT% >NUL
RAR.EXE A -ED -EP3 -IDQ ".\BACKUP\IME\%%~nI" "%windir%\%%I"
)
PAUSE


IME.SVE的内容:

;要备份和清理的输入法和键盘布局文件名请放到这里:如是简体系统则默认保留智能ABC;内码输入;全拼输入;繁体则保留(新)注音输入法,另外必须注意有目录的输入法保留时请使用目录,如MS拼音PINTLGNT,否则必须输入带扩展名的具体输入法的所有文件
;简体输入法名称:PINTLGNT:微软拼音3.0;IMSC40W:微软拼音4.0;智能ABC:WINABC;全拼:WINPY;双拼:Winsp;Winzm:郑码;Wingb:内码;Winbx:表形
;繁体输入法名称:新倉頡:CINTLGNT;倉頡:chajei;新注音:TINTLGNT;注音:phon.ime;速成:quick;BIG5码:winime;行列:winar30;:大易:dayi;U码:unicdime;英数:romanime
;其他输入法名称:IMKR6_1韩文输入;IMJP8_1日文输入
;
;
;可备份和清理的输入法,如果想保留则使用;注释掉要清理的项目;也可以添加其他输入法,如%ProgramFiles%\wnwb2005
;简体中文输入法
system32\IME\PINTLGNT
;
;繁体中文输入法
ime\CHTIME
system32\IME\CINTLGNT
system32\IME\TINTLGNT
;
;日文输入法(保留IMJP8_1)
ime\IMJP8_1
system32\imjp81.ime
system32\imjp81k.dll
system32\kbdjpn.dll
system32\msir3jp.dll
system32\msir3jp.lex
ime\imejp98
ime\imejp
;
;韩文输入法
ime\IMKR6_1
system32\imekr61.ime
system32\kbdkor.dll
system32\korwbrkr.dll
system32\korwbrkr.lex
;
;保留的键盘布局如下
;kbdus.dll



[ Last edited by HUNRYBECKY on 2007-2-13 at 11:03 PM ]
18 发表于 2007-02-13 23:03 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,179
发帖 442
注册 2006-09-09 22:47
19年会员
UID 62249
状态 离线
另外问个小问题:
一.如何在发帖子时给文本加颜色之类的以便突出显示,我这里怎么没有这些显示?
二.建议斑竹修改帖子的字数限制为100字符,字数太少,难以表达清楚.
19 发表于 2007-02-13 23:10 ·  中国 广西 玉林 博白县 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
20年会员
UID 44210
状态 离线
判断是否文件夹(缺点:不能区分包含“.”名称的文件夹):
@echo off 
for /f "delims=" %%i in (list.txt) do if not "%%~xi" == "" echo %%~ni
pause


list.txt
ime\IMJP8_1
system32\imjp81.ime
system32\imjp81k.dll
system32\kbdjpn.dll
system32\msir3jp.dll
system32\msir3jp.lex
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
HUNRYBECKY +5 2007-02-14 02:33
20 发表于 2007-02-13 23:32 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,179
发帖 442
注册 2006-09-09 22:47
19年会员
UID 62249
状态 离线
Originally posted by zh159 at 2007-2-13 23:10:
判断是否文件夹(缺点:不能区分包含“.”名称的文件夹):
@echo off 
for /f "delims=" %%i in (list.txt) do if not "%%~xi" == "" echo % ...


ZH159兄,这个判断虽然可以判断是否是文件夹,但是一是判断后如果是文件则得不到扩展名,所以备份时无法进行.二是无法根据把文件添加到相应的文件夹中。

@ECHO OFF
SET PATH=%CD%;%CD%\TOOLS\;%PATH%
SET TIMEOUT=1

IF NOT EXIST BACKUP\IME MD BACKUP\IME
FOR /F "EOL=;DELIMS=" %%I IN (.\Purge\IME.SVE) DO (
PING 127.0.0.1 -n %TIMEOUT% >NUL
ECHO 正在压缩备份输入法%windir%\%%I\下的文件,请稍等......
FOR /F "DELIMS=" %%A in ('ECHO %%I^|FINDSTR /I/V ".ime .mb .lex .tbl .hlp .cnt .dll"') DO (
ECHO %%A
)
REM RAR.EXE A -ED -EP3 -IDQ ".\BACKUP\IME\%%~nI" "%windir%\%%I"
)
PAUSE


我在代码中再加入FOR +FINDSTR来联合根据获取的变量I来判断,但是遗憾的是ECHO %%I ^|FINDSTR在FOR语句中似乎有问题,根本得理想的结果,即使说获取的结果居然%%A居然和%%I是一样的,等于没有一样,但是我单独测试,也就是不用在FOR语句中则是成功的,真有点不不明白了.
21 发表于 2007-02-13 23:46 ·  中国 广西 玉林 博白县 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
20年会员
UID 44210
状态 离线
要扩展名简单啊:
@echo off
for /f "delims=" %%i in (list.txt) do if not "%%~xi" == "" echo %%~nxi
pause
22 发表于 2007-02-14 00:32 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,179
发帖 442
注册 2006-09-09 22:47
19年会员
UID 62249
状态 离线
Originally posted by zh159 at 2007-2-13 23:46:
要扩展名简单啊:
@echo off
for /f "delims=" %%i in (list.txt) do if not "%%~xi" == "" echo %%~nxi
pause


非常谢谢兄的回答,刚才我一直测试,扩展名的问题已经解决,但是就是我刚才说的第二个问题很难解决,如何保持得到的文件名称以便是文件的时候直接追加到刚才的文件夹中?因为如果不是文件夹的时候变量会覆盖掉原来的变量.

为了便于测试,我上传了整个文件.请运行里面的TEST.BAT测试,谢谢

[ Last edited by HUNRYBECKY on 2007-2-14 at 12:52 AM ]
附件
test.rar (256.19 KiB, 下载附件所需积分 1 点, 下载次数: 6)
23 发表于 2007-02-14 02:10 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,179
发帖 442
注册 2006-09-09 22:47
19年会员
UID 62249
状态 离线
自己顶一下,今天下午开始放假啦,希望放假前有人给我一个思路,谢谢.
祝大家新年快乐,百事可乐.
24 发表于 2007-02-14 03:08 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,179
发帖 442
注册 2006-09-09 22:47
19年会员
UID 62249
状态 离线
经过不断的构思和调试,终于搞定了,其实很简单,因为变量每次要被替换掉,即使使用SET语句也一样,那么能不能像VB ,VBS设置全局变量一样呢,经过测试把变量写入一个文本中,然后再读入就达到了模仿VB,VBS的全局变量的效果,经过测试,下面代码完全达到了我所要的效果,工夫不费有心人,同时还是非常感谢ZH159,VIKILL等我对的问题回答.
测试:请下载22楼代码,并更换TEST.BAT中的内容为以下内容

@ECHO OFF
SET PATH=%CD%;%CD%\TOOLS\;%PATH%
SET TIMEOUT=1

IF NOT EXIST BACKUP\IME MD BACKUP\IME
FOR /F "EOL=;DELIMS=" %%I IN (.\Purge\IME.SVE) DO (
FOR /F "DELIMS=" %%A IN ("%%I") DO (
IF "%%~xA"=="" (
PING 127.0.0.1 -n %TIMEOUT% >NUL
ECHO 正在压缩备份输入法%windir%\%%I\下的文件,请稍等......
RAR.EXE A -ED -EP3 -IDQ ".\BACKUP\IME\%%~nA" "%windir%\%%I"
ECHO %%~nA>"%TEMP%\LIME.TXT"
) ELSE (
FOR /F "DELIMS=" %%J IN (%TEMP%\LIME.TXT) DO (
REM ECHO ".\BACKUP\IME\%%J" "%windir%\%%I"
RAR.EXE A -ED -EP3 -IDQ ".\BACKUP\IME\%%J" "%windir%\%%I"
)
)
)
)
DEL /F/Q/A "%TEMP%\LIME.TXT"
GOTO END

:END
PAUSE
25 发表于 2007-02-14 05:35 ·  中国 贵州 贵阳 电信
初级用户
积分 97
发帖 45
注册 2007-01-31 06:02
19年会员
UID 78190
性别 男
状态 离线
%~nI - 仅将 %I 扩充到一个文件名
%~xI - 仅将 %I 扩充到一个文件扩展名
%~nxI 可以这样用??
26 发表于 2007-02-14 06:33 ·  中国 广西 玉林 博白县 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
20年会员
UID 44210
状态 离线
for/?
可以组合修饰符来得到多重结果:

%~dpI - 仅将 %I 扩充到一个驱动器号和路径
%~nxI - 仅将 %I 扩充到一个文件名和扩展名
%~fsI - 仅将 %I 扩充到一个带有短名的完整路径名
%~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充
到找到的第一个驱动器号和路径。
%~ftzaI - 将 %I 扩充到类似输出线路的 DIR


[ Last edited by zh159 on 2007-2-13 at 05:34 PM ]
论坛跳转: