Board logo

标题: [求助]关于变量的难题,详情请入内查看。谢谢! [打印本页]

作者: insert     时间: 2004-11-5 00:00    标题: [求助]关于变量的难题,详情请入内查看。谢谢!
假设变量:A=D:\backup\dos\fdisk.exe ,请问如何才能在减去后面的fdisk.xe,只取前面的一部份呢?(变量 A 是搜索文件后赋于的值,不清楚具体的长度,只能知道后面的文件名。) 求那位大侠知道的,请帮帮小弟!急! 谢谢!![em06]

作者: Climbing     时间: 2004-11-5 00:00
请说清楚你的工作环境,是哪个版本的DOS?

作者: insert     时间: 2004-11-5 00:00
WIN98的MSDOS7.1中。麻烦帮帮忙!谢谢!![em04]

作者: 死性不改     时间: 2004-11-5 00:00
可以用change.exe来更改,例如文件x.txt的内容为:A=D:\backup\dos\fdisk.exe执行:change /i x.txt /from "fdisk.exe" /to null即可把后面的fdisk.exe去掉。

作者: Climbing     时间: 2004-11-5 00:00
在Win98 DOS中一时想不到有什么系统命令可以实现这个功能,但有一个第三方的程序Strings却可以实现这个功能。以你的例子来说: strings filedrive = filedrive %A% strings filedir = filedir %A% set mydir=%filedrive%%filedir%\strings下载可以在DOS联盟的网站上找到,或者下载这个(我给改名成了string.com): climbing.minidns.net/clone/dos ...

作者: insert     时间: 2004-11-6 00:00
谢谢!!依照Climbing的方法问题得到了解决!! 我手头也有strings这个程序,但一直都只会用它做一点简单的变量修改,只怪小弟的E文太差了。真希望Climbing能写一个较详细的教程或是将它翻译一下!!呵呵!那就太好了。[em07]

作者: Climbing     时间: 2004-11-6 00:00
要想搞好计算机方面的东东,我觉得英文是很基础的东西,如果什么东西都需要汉化才会用,那是很不现实的。而且计算机方面的英文文档大部分都是很浅显的,只要你理解基本的语法再配上词典软件,在没有阅读困难的情况下,大部分都应该可以看懂。不要看到一大篇英文就感到害怕,尝试着去读一读,读得多了,很多东西自然就看明白了。就strings来说,它的基本功能是对字符串进行操作,首先一个帮助就是:strings /? STRINGS 2.5 Copyright 1991-1993, 1995 Douglas Boling First published in PC Magazine, December 29, 1992This is a list of the available commands.(下面是strings的子命令列表,具体每个命令是干什么的,偶也没有一一查看过,但从命令名上可以看出一个大概:)LEFT RIGHT MID LENGTH FIND FINDC LOWER UPPER CHAR VAL FILEDRIVE FILEDIR FILENAME FILEEXT PARSE ADDCOMMAS REPEAT READ WRITE FILESIZE LINESIZE TRUENAME FILEDATE FILETIME VER ASK INWIN 2FCHECK ENVFREE ENVSIZE MASTERVAR LOCALVAR TRUEVER FILES LASTDRIVE CODEPAGE COUNTRY BIOSDATE GETKEY LOCALENV MASTERENV ADD SUB MUL DIV AND OR XOR NOT CONVERT PEEK POKE IN OUT INTERRUPT SCAN DAY MONTH DATE TIME MEMTOTAL MEMFREE XMSTOTAL XMSFREE XMSVER EMSTOTAL EMSFREE EMSVER UMBLARGE STRINGSVER INSTALLED HELPFor help on a specific command type: STRINGS HELP Command(查看某个特定命令的帮助) 例如:strings help left Function: LEFT - Returns left n characters.(功能:返回左边的n个字符,实际上就是从左边取子串)Syntax: STRINGS [dest var =] LEFT String, Number of chars 语法: strings [目标变量 =] LEFT 源字符串, 要取的字符数量其它的应该都大同小异的。

作者: insert     时间: 2004-11-6 00:00
感谢指教!!谢谢!! [em04]

作者: insert     时间: 2004-11-6 00:00
麻烦再次指教,昨晚我按照Climbing的方法在WIN98的DOS窗口试了一下STRINGS,成功的解决了问题。可是今天用Wengier的超级启动盘启动至纯DOS下,却发觉更大的问题,具体如下: A:\>set up=e:\i386\winnt.exe "E:是光驱盘符 A:\>strings a=filedrive %up% A:\>strings b=filedir %up% A:\>set c=%a%%b%\ A:\>set "显示所有变量" 变量显示如下: RAMDRIVE=F: TMP=F:\TEMP TEMP=F:\TEMP COMSPEC=F:\SYSTEM\COMMAND DIRCMD=/OGN /4 PROMPT=$P$G PATH=.\;F:.;F:\SYSTEM;C:.;A:.;.. CDROM=D: UP=E:\i386\winnt.exe A=\\ B=E.\A.\i386\ C=\\E.\A.\i386\ 我不知为什么会成这样??本来C=E:\i386\,才是正确的,我换了很多张启动盘都如此,只有在WIN98的DOS窗口C变量才是正确的。 还有在纯DOS下用上面的方法,只要变量%UP%的盘符不是光驱盘符而是硬盘盘符或是虚拟盘的盘符,那么变量%C%的答案就会正确。而小弟又偏偏正是要对光盘执行的操作,所以麻烦知道解决方法的大侠帮帮忙!!小弟已经研究了一整天了,却不得要领! 顺便问一下4楼的大侠,change是什么软件??在哪可以下载到?? 谢谢!![em04]

[此贴子已经被作者于2004-11-7 12:46:59编辑过]


作者: insert     时间: 2004-11-9 00:00
怎么没人回答小弟的问题呢??是不是小弟写得不够清楚??[em04]

作者: willsort     时间: 2004-11-9 00:00
Re insert: 这很可能是因为STRINGS处理文件名时的某些局部特性,建议你更详细的了解STRINGS文档,如果遇到无法克服的障碍,那么可以看看这个下面这个程序。用单纯DOS命令实现,未使用第三方命令,当然这不是对症的解决方案,不过应该可以给你一些参考。你可以将它简化修改为自己特定的用途。
@echo off if not %pass%!==! goto %pass% set pass=pass2 set count=!! set flag= set pattern= set realdir= set testdir= set olddircmd=%dircmd% set dircmd= set a= set ostype=DOS if %OS%!==Windows_NT! set ostype=NT set null=nul if %ostype%==NT set null= :loop0 set pattern=%pattern%%1 if %2!==! goto cont0 set pattern=%pattern% shift set flag=" goto loop0 :cont0 if not exist %flag%%pattern%%null%%flag% goto error echo %pattern%> }1{.dat dir %flag%%pattern%*.*%flag% /a:d | find "Volume in drive" > }2{.bat echo set !=%%3> volume.bat call }2{ set !=%!%:\ set realdir=%!% uterloop dir %flag%%realdir%*.*%flag% /a:d /b > }3{.dat echo.>> }3{.dat date < }3{.dat | find "En" > }4{.dat echo exit>> }4{.dat command /e:1024 < }4{.dat >> nul call }5{.bat echo %realdir%> }6{.dat find /i "%pattern%" }6{.dat > nul if not errorlevel 1 goto display set count=%count%! goto outerloop :pass2 if %ostype%==NT goto nt1 if %4!==! goto end goto cont11 :nt1 if %5!==! goto end :cont11 set a=%realdir% set testdir= :innerloop if %ostype%==DOS set a=%a%%4 if %ostype%==NT set a=%a%%5 if %ostype%==DOS set testdir=%testdir%%4 if %ostype%==NT set testdir=%testdir%%5 shift if %ostype%==NT goto nt2 if %4!==! goto cont1 goto cont12 :nt2 if %5!==! goto cont1 :cont12 set a=%a% set testdir=%testdir% goto innerloop :cont1 set a=%a%\ find /i "%a%" }1{.dat > nul if errorlevel 1 goto end echo set %count%=%testdir%> }5{.bat echo set realdir=%a%>> }5{.bat goto end :display :cleanup set dircmd=%olddircmd% set maxcount=%count% set count=! echo The elements in %pattern% are :cleancountloop set %count%= if %count%==%maxcount% goto cleancont set count=%count%! echo echo %%%count%%%>}5{.bat call }5{ set %count%= goto cleancountloop :cleancont set pass= set ostype= set count= set maxcount= set pattern= set realdir= set testdir= set a= set flag= set olddircmd= del }?{.dat goto end :error echo. echo. echo ERROR Report: %pattern% echo does not exist, lacks a trailing '\' or has some other error. :end

作者: insert     时间: 2004-11-9 00:00
太复杂了,我看了半天也没看得懂???被那么多的变量搞得晕头转向的,还有这些{ }符号我根本就不懂什么意思。[em06] 唉!! 我的批处理功夫还没到家。呵呵!! 谢谢willsort的指教,我会慢慢研究的。谢谢 顺便问一下,有没有简单点的方法??呵呵 [em04]

作者: Climbing     时间: 2004-11-10 00:00
我也看不懂WillSort的程序(连干什么的都看不懂),惭愧啊,都是搞DOS的,差别怎么就这么大尼?我试了一下,strings在处理光驱盘符时确实存在问题,假设你的光驱盘符在E:,文件名为e:\i386\winnt.exe,那么string看到的路径是这样的:\\E.\A.\I386\WINNT.EXE,我也很奇怪,光驱盘符怎么会变成了\\E.\A.。但解决办法还是有的,当然仍然是通过string来解决,如下: set filename=winnt.exe set up=e:\i386\winnt.exe ::上面都是已知的环境变量 ::取得文件名的长度 strings len1=length %filename% :: 取得文件全路径字符串的长度 strings len2=length %up% :: 用上面的长度减去文件名的长度 strings len=sub %len2%, %len1% :: 取得需要的路径 strings mydir=left %up%, %len% echo %mydir%在上面的例子中,绕过了使用strings直接取得文件所在盘符和路径的命令,而是使用string对字符串进行操作的功能。但前提就是你必须知道文件名。如果连文件名也不知道。可以用这个办法得到: strings name=filename %up% strings ext=fileext %up% if "%ext%"=="" set filename=%name% if not "%ext%"=="" set filename=%name%.%ext%

作者: autoit     时间: 2004-11-10 00:00
受益非浅...[em04]

作者: willsort     时间: 2004-11-14 00:00
Re insert & Climbing: 上文中的代码,是我在学习跨系统批处理编程时偶然搜到的,由于原文糟糕的编写风格,我在分析时也不得不下了一番功夫。 总体来看,此代码力图实现的目标是,在大多dos命令行环境中可以将指定的路径字符串的分析为盘符和各级目录名。原程序只是实现了基本算法,可以将分析结果逐行显示,除此而外,并未添加任何实用性代码。运行时,需指定一有效的路径,其中不能含文件名,不能省略路径后的"\"。原文之所以如此复杂,除了功能的复杂和风格的不善之外,主要是为了兼容性问题所付出的代价。 当然,对于你的问题,完全不用如此复杂,只需要抽取算法核心的其中一部分修改以下即可。程序通过dir信息来获取文件的盘符信息,当然也可以获得文件的路径信息,其中dir信息的第三行内容即为文件所在的目录信息。而获取命令输出信息应该是个不复杂的操作。
@echo off
dir %A% | find " Directory of ">_setdir.bat
echo set abase=%%2>Directory.bat
call _setdir.bat
del _setdir.bat
del Directory.bat
当然,这只是一个基本的原型,想要应用还要有选择地做一些兼容性方面的考量,比如nt的中文命令行,目录名中含空格等,相信应该不难解决的。 [ Last edited by willsort on 2006-2-3 at 18:55 ]

作者: ^_^     时间: 2004-11-14 00:00
to willsort 我没看明白,但是否有笔误,生成了Directory.bat,却没有call它,而直接del了????[em06]

[此贴子已经被作者于2004-11-14 19:44:58编辑过]


作者: qzwqzw     时间: 2004-11-15 00:00
Directory.bat是在~setdir.bat中调用的啊,这就是技巧之精华呀!

作者: Climbing     时间: 2004-11-16 00:00
高手就是高手。配服ing...如果在中文版的NT环境下,可以使用chcp 437命令将命令的提示语言改为英文,另外,如果路径中带有太多空格,也是不太好解决的(不能超过8个),如果超过这个数量,就要另想办法了,可能需要用到shift命令。WillSort的批处理修改如下:
@echo off chcp 437 dir %A% | find " Directory of ">~setdir.bat echo set abase=%%2%%3%%4%%5%%6%%7%%8%%9 >Directory.bat call ~setdir.bat del ~setdir.bat del Directory.bat

作者: insert     时间: 2004-11-17 00:00
谢谢各位大侠,问题已经用STRINGS得到解决。虽然我还是不明白willsort的批处理,但还谢谢!![em04]

作者: willsort     时间: 2004-11-18 00:00    标题: 问题可能并非如此简单
Re Climbing: 可能问题并非我当初预想的那样简单。 关于中文命令行,chcp是可以改变英文代码页,但是改变了代码页,会导致无法识别中文路径,那么chcp 437变成了拆东补西。 关于文件名空格,直接导致命令行参数不适宜分析文件和路径,因为空格有单个空格,多个独立空格,多个连续空格等三种,而set abase=%%2%%3%%4%%5%%6%%7%%8%%9却将其中的空格全部滤掉了,而如果在它们之间加上空格,则可能会导致abase后跟随多余的空格,这对路径来说,也是致命的。 也许根本的解决之道,是在使用中限制多国代码和空格的使用,但是势必因此降低程序的普适范围。唯一值得安慰的是,深层批处理本就不是应用广泛的程序代码。

作者: Climbing     时间: 2004-11-19 00:00
还是WillSort考虑的比较周详,如果路径名中带空格,我的批处理会将所有的空格去掉,这根本是没有意义的。看来还是用第三方的工具比较好一些,DOS命令的字符串处理功能实在是太弱了。

作者: i386     时间: 2006-1-11 11:56
路过,学习一下.