中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]关于变量的难题,详情请入内查看。谢谢!
« [1] [2] »
作者:
标题: [求助]关于变量的难题,详情请入内查看。谢谢! 上一主题 | 下一主题
insert
中级用户




积分 282
发帖 52
注册 2004-9-29
状态 离线
『楼 主』:  [求助]关于变量的难题,详情请入内查看。谢谢!

假设变量:A=D:\backup\dos\fdisk.exe ,请问如何才能在减去后面的fdisk.xe,只取前面的一部份呢?(变量 A 是搜索文件后赋于的值,不清楚具体的长度,只能知道后面的文件名。)
   求那位大侠知道的,请帮帮小弟!急!
    谢谢!![em06]


2004-11-5 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 2 楼』:  

请说清楚你的工作环境,是哪个版本的DOS?



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-11-5 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
insert
中级用户




积分 282
发帖 52
注册 2004-9-29
状态 离线
『第 3 楼』:  

WIN98的MSDOS7.1中。麻烦帮帮忙!谢谢!![em04]

2004-11-5 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
死性不改
中级用户




积分 378
发帖 88
注册 2004-5-5
状态 离线
『第 4 楼』:  

可以用change.exe来更改,例如文件x.txt的内容为:A=D:\backup\dos\fdisk.exe执行:change /i x.txt /from "fdisk.exe" /to null即可把后面的fdisk.exe去掉。



www.51ct.net
2004-11-5 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 5 楼』:  

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



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-11-5 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
insert
中级用户




积分 282
发帖 52
注册 2004-9-29
状态 离线
『第 6 楼』:  

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

2004-11-6 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 7 楼』:  

要想搞好计算机方面的东东,我觉得英文是很基础的东西,如果什么东西都需要汉化才会用,那是很不现实的。而且计算机方面的英文文档大部分都是很浅显的,只要你理解基本的语法再配上词典软件,在没有阅读困难的情况下,大部分都应该可以看懂。不要看到一大篇英文就感到害怕,尝试着去读一读,读得多了,很多东西自然就看明白了。就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 源字符串, 要取的字符数量其它的应该都大同小异的。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-11-6 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
insert
中级用户




积分 282
发帖 52
注册 2004-9-29
状态 离线
『第 8 楼』:  

         感谢指教!!谢谢!!  [em04]

2004-11-6 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
insert
中级用户




积分 282
发帖 52
注册 2004-9-29
状态 离线
『第 9 楼』:  

   麻烦再次指教,昨晚我按照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编辑过]




2004-11-6 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
insert
中级用户




积分 282
发帖 52
注册 2004-9-29
状态 离线
『第 10 楼』:  

      怎么没人回答小弟的问题呢??是不是小弟写得不够清楚??[em04]

2004-11-9 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 11 楼』:  

Re insert:    这很可能是因为STRINGS处理文件名时的某些局部特性,建议你更详细的了解STRINGS文档,如果遇到无法克服的障碍,那么可以看看这个下面这个程序。用单纯DOS命令实现,未使用第三方命令,当然这不是对症的解决方案,不过应该可以给你一些参考。你可以将它简化修改为自己特定的用途。

  Quote:
@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





※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-11-9 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
insert
中级用户




积分 282
发帖 52
注册 2004-9-29
状态 离线
『第 12 楼』:  

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

2004-11-9 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 13 楼』:  

我也看不懂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%



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-11-10 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
autoit
系统支持




积分 904
发帖 339
注册 2002-10-10
来自 厦门
状态 离线
『第 14 楼』:  

受益非浅...[em04]



joomla! Autoit!
2004-11-10 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 15 楼』:  

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 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-11-14 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: