Board logo

标题: 如何获取路径最后一个"\"后的字串[完美解决] [打印本页]

作者: HUNRYBECKY     时间: 2007-2-13 02:45    标题: 如何获取路径最后一个"\"后的字串[完美解决]

已解决,见http://www.cn-dos.net/forum/viewthread.php?tid=27658&page=1&sid=FB2nu4#pid174202 贴2楼ZH159兄的回答.

下面是我的代码,请修改
@ECHO OFF
SET PATH=%CD%;%CD%\TOOLS\;%PATH%

FOR /F "EOL=;DELIMS=" %%I in (.\Purge\PurgeS.SVE) DO (
    ECHO 正在压缩备份%windir%\%%I\下的文件,请稍等......
    PING 127.0.0.1 -n %TIMEOUT% >NUL
    RAR.EXE A -EP3 -IDQ ".\BACKUP\%%I" "%windir%\%%I"
)
PAUSE
其中PurgeS.SVE中的内容如下:
;这里可以设置要备份和清理的系统级垃圾文件,必须以文件夹来表示,而且必须以%windir%为根来表示
;如果设置了字体清理,需要设置在FONTS.SVE中设置要保留的字体文件
;输入法清理请单独在IME.SVE中进行设置
;
;
;可备份和清理的文件夹,如果想保留则使用;注释掉要清理的项目;也可以添加其他需要备份和清理的文件夹中的内容如Web\Wallpaper下的墙纸
;字体
FONTS
;帮助
HELP
;帮助支持中心
PCHealth
;驱动缓存
Driver Cache
;DLL缓存
SYSTEM32\dllcache
;系统修复备份
REPAIR
;预存取
prefetch
;搜索助理
srchasst
;微软代理
msagent
;系统激活(只限于VOL版)
;system32\oobe
大家应该看明白了我这段代码的意思,我是使用RAR程序把PurgeS.SVE指定中指定的文件夹下的所有文件压缩备份到当前的BACKUP目录下,但是运行到有子目录的SYSTEM32\dllcache时则出现错误,提示找不到压缩文件要备份的路径,因为我是想不区分有无子目录一切都直接备份到BACKUP目录,而且并以目录的最后一个子目录的名称来确定压缩文件的名称,如SYSTEM32\dllcache备份后压缩文件应该是dllcache.rar 而且必须位于BACKUP目录下

希望大家给我一个解决的思路或代码,要求使用批处理,不使用VBS,运行环境为WINXP,谢谢.

有关RAR命令,我刚才把自己的学习笔记发到http://www.cn-dos.net/forum/viewthread.php?tid=27657&sid=FB2nu4 ,可以参考.


17楼出现新的问题,在线等待高手们的再次回答

[ Last edited by HUNRYBECKY on 2007-2-14 at 03:09 AM ]
作者: slore     时间: 2007-2-13 02:49
dim Str1,Pos
Str1="C:\WINDOWS\IME\CINTLGNT"
Pos=InstrRev(Str1,"\")
msgbox mid(Str1,Pos+1,len(Str1)-Pos)
作者: HUNRYBECKY     时间: 2007-2-13 02:58


  Quote:
Originally posted by slore at 2007-2-13 02:49:
dim Str1,Pos
Str1="C:\WINDOWS\IME\CINTLGNT"
Pos=InstrRev(Str1,"\")
msgbox mid(Str1,Pos+1,len(Str1)-Pos)

谢谢回答,我想使用批处理,不使用VBS
作者: vkill     时间: 2007-2-13 03:00
for /f "tokens=*" %? in ('dir  /ad/b c:\') do (echo %?|sed -r "s/.*\\([^\]*)$/\1/")
作者: redtek     时间: 2007-2-13 03:01
获取路径最后一个"\"后的字串原理:)

FOR  /?

  Quote:
%~nI        - 仅将 %I 扩展到一个文件名


作者: HUNRYBECKY     时间: 2007-2-13 03:09


  Quote:
Originally posted by vkill at 2007-2-13 03:00:
for /f "tokens=*" %? in ('dir  /ad/b c:\') do (echo %?|sed -r "s/.*\\([^\]*)$/\1/")

我不想使用SED这个东西,谢谢VKILL兄弟的回答,有其他方法吗?
作者: HUNRYBECKY     时间: 2007-2-13 03:15


  Quote:
Originally posted by redtek at 2007-2-13 03:01:
获取路径最后一个"\"后的字串原理:)

FOR  /?


谢谢REDTEK兄的回答,但是我如下使用,好象不对,能否修改下.
@ECHO OFF
SET PATH=%CD%;%CD%\TOOLS\;%PATH%

FOR /F "EOL=;DELIMS=" %%I in (.\Purge\PurgeS.SVE) DO (
    ECHO 正在压缩备份%windir%\%%I\下的文件,请稍等......
    PING 127.0.0.1 -n %TIMEOUT% >NUL
    RAR.EXE A -EP3 -IDQ ".\BACKUP\%%I:%~nI" "%windir%\%%I"
)
PAUSE

作者: slore     时间: 2007-2-13 03:28
@echo off
FOR /F "EOL=;DELIMS=" %%I in (PurgeS.SVE) DO (
    ECHO 正在压缩备份%windir%\%%I\下的文件,请稍等......
    PING 127.0.0.1 -n %TIMEOUT% >NUL
for /F "tokens=2 DELIMS=\" %%J IN ("%%I") do echo ".\BACKUP\%%J" "%windir%\%%I"
echo ".\BACKUP\%%I" "%windir%\%%I"
)
PAUSE
作者: HUNRYBECKY     时间: 2007-2-13 03:50


  Quote:
Originally posted by slore at 2007-2-13 03:28:
@echo off
FOR /F "EOL=;DELIMS=" %%I in (PurgeS.SVE) DO (
    ECHO 正在压缩备份%windir%\%%I\下的文件,请稍等......
    PING 127.0.0.1 -n %TIMEOUT% >NUL
for /F "tok ...

再次谢谢兄的回答,不过因为路径的层数不是固定的,所以使用你的这个方法还是不行,你这个DELIMES=2只有2层,如果是3层,4层呢?

再说明下我获取以\的目录的最后的名称的原因在于我便于使用RAR命令重新恢复,如我备份了所有项目,那么可以让用户选择要恢复的内容,如日文输入法,韩文输入法,MS拼音输入法等,如果整体直接压缩到一个或某个包内,恢复时使用RAR命令是很不方便的

[ Last edited by HUNRYBECKY on 2007-2-13 at 03:53 AM ]
作者: HUNRYBECKY     时间: 2007-2-13 04:03
依然在线等待..................期待高手们的回答.
作者: HUNRYBECKY     时间: 2007-2-13 04:20    标题: [在线求助]如何处理这样的路径字符串[已结]


─────────────────── 版务记录 ────────────────────
执行:namejm
说明:{tid=27658}与本主题存在上下文关系,合并到本主题下。
处罚:因该用户在论坛里并非新人,理应对本论坛的发帖规定有所了解,故扣除
  该用户发帖所得的4点积分。
─────────────────── 版务记录 ────────────────────


C:\WINDOWS\system32
C:\WINDOWS\SHELLNEW
C:\WINDOWS\system32\dhcp
C:\WINDOWS\system32\dllcache
C:\WINDOWS\Help\Tours\mmTour
C:\WINDOWS\Help\Tours\WindowsMediaPlayer
C:\WINDOWS\ime\CHSIME
C:\WINDOWS\ime\SHARED


上面这些路径中,我只想获取路径中最后一个\的内容,如得到的结果如下
system32
SHELLNEW
dhcp
dllcache
mmTour
WindowsMediaPlayer
CHSIME
SHARED

请求高手们给点意见,要求不使用第三方工具,不使用VBS脚本

[ Last edited by namejm on 2007-2-12 at 04:46 PM ]
作者: zh159     时间: 2007-2-13 04:42
list.txt
C:\WINDOWS\system32
C:\WINDOWS\SHELLNEW
C:\WINDOWS\system32\dhcp
C:\WINDOWS\system32\dllcache
C:\WINDOWS\Help\Tours\mmTour
C:\WINDOWS\Help\Tours\WindowsMediaPlayer
C:\WINDOWS\ime\CHSIME
C:\WINDOWS\ime\SHARED

@echo off
for /f "delims=" %%i in (list.txt) do echo %%~ni
pause

作者: HUNRYBECKY     时间: 2007-2-13 05:08
非常感谢zh159兄对我的问题多次回答,得向你好好学习.
刚才redtek兄也回答了我这个问题,本人因为对FOR语句实在用的不熟悉,所以还是没有明白redtek兄的意思,我居然当作SET的变量来处理,搞成%%I:%~nI,所以怎么搞都不出来.

再次非常感谢兄的回答.
作者: slore     时间: 2007-2-13 05:16
同时感谢~
对bat里的for还差好多呀..
作者: vkill     时间: 2007-2-13 06:03
哎,竟然忘记了用%~ni
作者: HUNRYBECKY     时间: 2007-2-13 22:35


  Quote:
Originally posted by HUNRYBECKY at 2007-2-13 04:20:

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

谢谢处罚,因为当时比较急,又要放假了,想在放假前做处理,放假后可能很少上网,不是很方便,所以发多个帖子以加快回答的速度.我以后会记住的.
作者: HUNRYBECKY     时间: 2007-2-13 22:57
再问下高手门一个问题:我想在下面的批处理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 ]
作者: HUNRYBECKY     时间: 2007-2-13 23:03
另外问个小问题:
一.如何在发帖子时给文本加颜色之类的以便突出显示,我这里怎么没有这些显示?
二.建议斑竹修改帖子的字数限制为100字符,字数太少,难以表达清楚.
作者: zh159     时间: 2007-2-13 23:10
判断是否文件夹(缺点:不能区分包含“.”名称的文件夹):
@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

作者: HUNRYBECKY     时间: 2007-2-13 23:32
[quote]Originally posted by zh159 at 2007-2-13 23:10:
判断是否文件夹(缺点:不能区分包含“.”名称的文件夹):
@echo off
for /f "delims=" %%i in (list.txt) do if not "%%~xi" == "" echo % ... [/quote]

ZH159兄,这个判断虽然可以判断是否是文件夹,但是一是判断后如果是文件则得不到扩展名,所以备份时无法进行.二是无法根据把文件添加到相应的文件夹中。
[code]
@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语句中则是成功的,真有点不不明白了.
作者: zh159     时间: 2007-2-13 23:46
要扩展名简单啊:
@echo off
for /f "delims=" %%i in (list.txt) do if not "%%~xi" == "" echo %%~nxi
pause
作者: HUNRYBECKY     时间: 2007-2-14 00:32


  Quote:
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 ]
附件 1: test.rar (2007-2-14 00:52, 256.19 K, 下载附件所需积分 1点 ,下载次数: 6)

作者: HUNRYBECKY     时间: 2007-2-14 02:10
自己顶一下,今天下午开始放假啦,希望放假前有人给我一个思路,谢谢.
祝大家新年快乐,百事可乐.
作者: HUNRYBECKY     时间: 2007-2-14 03:08
经过不断的构思和调试,终于搞定了,其实很简单,因为变量每次要被替换掉,即使使用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

作者: csx163     时间: 2007-2-14 05:35
%~nI        - 仅将 %I 扩充到一个文件名
%~xI        - 仅将 %I 扩充到一个文件扩展名
%~nxI 可以这样用??
作者: zh159     时间: 2007-2-14 06:33
for/?

  Quote:
可以组合修饰符来得到多重结果:

     %~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 ]