无忧启动论坛

标题: ,................. [打印本页]

作者: 527104427    时间: 2012-5-21 19:52
标题: ,.................
本帖最后由 527104427 于 2016-8-15 21:38 编辑


http://blog.sina.com.cn/a527104427

http://bbs.wuyou.net/forum.php?m ... d=379244&extra=
作者: pznpt    时间: 2012-5-21 21:12
如果前面字符数固定的话,貌似可以这样?
@echo off
set kk=1:2\aaa\bbb\ccc\aaa.gho
strings a=left %kk%,16
echo %a%
pause
作者: 527104427    时间: 2012-5-22 08:17
标题: 回复 #2 pznpt 的帖子
不是固定的,我想实现的是,这个KK的值由用户输入,输入后,批处理自动截取GHO文件前面的路径

在我DIY的MAXDOS9里面,备份还原是创建一个畸形目录来存放GHO文件,
路径可以由用户自由输入
这个畸形目录是由omnifs来创建,如果用户修改了路径,就导致一个隐患:omniifs创建的目录和
Ghost备份还原的目录不一致,这样就失败了
作者: 527104427    时间: 2012-5-22 10:01
标题: 回复 #2 pznpt 的帖子
貌似用sed能解决问题,刚才在批处理之家掏到一段代码:
set kk=1:2\aaa\bbb\ccc\aaa.gho
echo %kk% | sed "s/.*\\//"

截取到的是aaa.gho,不知道怎么截取前面的?


这个问题似乎用awk也能解决,本人小菜,只会改现成的,要自已写出来,还是个难题
作者: my9823    时间: 2012-5-22 10:11
楼主听说过正则表达式吧!
作者: 527104427    时间: 2012-5-22 10:22
标题: 回复 #5 my9823 的帖子
没有,请指教!!谢谢
作者: my9823    时间: 2012-5-22 10:27
只能看懂一点,将路径替换为空:
.代表单个字符,字母数字之类;
*代表前边的元素出现个数(0或者n个),尽可能多的匹配;
\\转义斜杠,这个就限制它匹配到最后一个\,不至于匹配后边的文件名,
作者: 527104427    时间: 2012-5-22 10:35
标题: 回复 #7 my9823 的帖子
那么可不可以反过来呢?把文件名替换为空,保留路径?
作者: my9823    时间: 2012-5-22 10:38
有个()和\1可以临时保存匹配对象,例如路径,替换后边为空将可惜偶也懂点皮毛,帮不上啊!
作者: 527104427    时间: 2012-5-22 11:03
标题: 回复 #9 my9823 的帖子
没事,再研究研究吧!!!!!!!!
作者: pznpt    时间: 2012-5-22 11:04
标题: 回复 #4 527104427 的帖子
bathome我也有回复,呵呵。。。
@echo off
set str=
set kk=1:2\aaa\bbb\ccc\abc.gho
:11
strings a=find %kk%,\
if "%a%"=="0" goto 12
strings b=mid %kk%,1,%a%
strings c=add %a%,1
strings kk=mid %kk%,%c%
set str=%str%%b%
goto 11
:12
echo %str%
作者: 527104427    时间: 2012-5-22 11:07
标题: 回复 #11 pznpt 的帖子
兄弟强!!马上试试看
作者: 527104427    时间: 2012-5-22 11:14
标题: 回复 #11 pznpt 的帖子
哈哈,OK了,连带空格的情况都给处理了,感谢感谢!!!!
作者: dos时代菜鸟    时间: 2012-5-23 09:54
这个 不用循环 也可以搞定的,strings 本身就有 获取文件目录 的函数,只是这个函数不支持 1:2 这样的分区盘符表示方法,我们变通一下就可以了。
看下面:

@echo off
set p0=1:2\dasfds\fdsaf\dsaf\sda\fdsaf\asdf\abc.gho
strings n=findc %p0%,\
strings p1=left %p0%,%n%
strings p2=mid  %p0%,%n%
strings p=filedir a:%p2%
strings p=mid %p%,2
set px=%p1%%p%
echo %px%

1、获取 第一个“\” 在字符串的位置
2、分别 截取 第一个 "\" 左右两侧 内容为 p1 p2 两个变量
3、通过 filedir 函数 获取 字符串  a:%p2% 的路径  给变量 p
4、去除 p 变量 第一个字符 "\" ,并与 p1 结合 就 生成了变量 px ,px 就是 所求。

[ 本帖最后由 dos时代菜鸟 于 2012-5-23 10:00 编辑 ]
作者: pznpt    时间: 2012-5-23 10:45
标题: 回复 #14 dos时代菜鸟 的帖子
还是 dos时代菜鸟 大大强啊!
刚开始我也试过filedir和filedrive,只是用的e:\aaa\bbb\ccc\abc.gho形式。由于虚拟机不存在e:盘,还以为strings只支持实际存在的文件呢,其实只需要实际已存在的盘符即可。只一点,与CMD窗口的for截取有点不同,呵呵。。。
dos时代菜鸟 大大的代码简单明了,受教了!
作者: dos时代菜鸟    时间: 2012-5-23 11:16
filedir 不支持 带 空格的字符串。
要支持 带空格的 字符串 需要用到循环。如下:

@echo off
for %%c in (p0 n0 l n m) do set %%c=
set p0=1:2\dasfds\ fdsaf\dsa f\sda \fdsa f\as df\abc.gho
strings n0=length %p0%
:fn
strings l=mid %p0%,%n%,1
if %l%*==\* set m=%n%
if %n%*==%n0%* goto fn_
strings n=add %n%,1
goto fn         
:fn_
strings p=left %p0%,%m%
for %%c in (p0 n0 l n m) do set %%c=
echo %p%

循环体 用于找出 字符串中 最后一个 "\" 的位置,然后用 left 函数截取 最后一个"\"左边的内容。
作者: 527104427    时间: 2012-5-23 11:52
老大们太强大了,小的还需潜水学习!!




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3