中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]请教如何进行批量改名?
作者:
标题: [求助]请教如何进行批量改名? 上一主题 | 下一主题
tired_bird
中级用户




积分 307
发帖 58
注册 2004-10-21
状态 离线
『楼 主』:  [求助]请教如何进行批量改名?

      dos下很多软件例如change就不支持长文件名,所以用change进行文本处理之前
就要把很多文件进行重名成他支持的短文件名,我现在有很多如同grib2002090500.ctl
我想把它前面6个字符去掉命名成02090500.ctl,我尝试以下两种方法都不行

for /f %c in (`dir /b |find "grib20"`)  ren %c "%c|lmod /l* [7,12]"                                      
ren "dir /b |find "grib20""  "dir /b |find "grib20" |lmod /l* [7,12]"
都不行
如何写这个批处理呢?

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

网络独行侠


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

这说明你没有认真学习DOS命令的使用,我已经说过很多次了,DOS不是Linux,不要用Linux的思维习惯来工作于DOS。其实好好研究一下dir和lmod的用法,你的问题是很容易解决的:dir /b grib20*.* | lmod /L* ren [] [7,11] > temp.bat
call temp.bat
del temp.bat





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




积分 307
发帖 58
注册 2004-10-21
状态 离线
『第 3 楼』:  

首先谢谢climbing帮我解决了这个问题。其次作为一个刚学dos的新手来说,不要用Linux的思维习惯来工作于DOS,很难,不过我会努力纠正,争取以后向您尽量少问一些的低级问题。最后还望以后多多指点。

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

网络独行侠


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

其实Linux的思维习惯应该是灵活变通,DOS相对于Linux来说,要缺乏一些灵活性,但道理和基础上的东西基本上是一样的。我所谓的Linux思维习惯不是指这个层面,而是指不能把DOS当作Linux来看待,Linux支持的东东DOS未必能够支持,但具体到每个命令的应用却是大同小异的。例如Linux下的ls在DOS里变成了dir,而mv则变成了ren或者move,cp变成了copy,这只是命令名的差异而已(功能上也略有差异,细细研究每一个命令就可以找到差异所在),另外象输入、输出重定向、管道操作这些东西DOS也是有限度的支持的。我觉得如果你是一个可以熟练使用Linux的人,适应起dos来应该是更快的,而不应该是目前这种纠缠于问一些基本的命令使用问题。



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




积分 307
发帖 58
注册 2004-10-21
状态 离线
『第 5 楼』:  

谢谢你的一番话,如何我想把一个文件夹中所有的如grib2002090500.ctlgrib2002090506.ctlgrib2002090512.ctlgrib2002090518.ctlgrib2002090600.ctlgrib2002090606.ctl.......每隔6小时的一个资料命名为1.ctl2.ctl3.ctl4.ctl5.ctl6.ctl...10.ctl...即grib2002090500.ctl  改名为1.ctlgrib2002090506.ctl  改名为2.ctlgrib2002090512.ctl  改名为3.ctl..........grib2002090712.ctl  改名为10.ctl该如何写这个批处理?有急用还望指教!

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

网络独行侠


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

@echo off
:: RenTheFile.cmd 根据指定的文件名的特征将其改名(想起来我就晕啊,我整个帮着你做工作啊,有什么报酬吗?)
:: 这个批处理文件一定要运行在2000/xp/2003下,NT和98下不敢保证其可行性
:: 用法:RenTheFile <要改名的文件全名>,例如:RenTheFile grib2002090712.ctl
set debug=0
set file=%1
if "%file%"=="" goto _usage
set dd=%file:~10,2%
if %dd:~0,1%==0 set dd=%dd:~-1%
if %debug%==1 echo dd=%dd%
set hh=%file:~12,2%
if %debug%==1 echo hh=%hh%
set /a num=(dd-5)*4+(hh/6+1)
if %debug%==1 echo num=%num%
if %debug%==1 pause
set newname=%num%%file:~-4%
echo 准备将文件%file%改名为%newname%...
if exist %newname% goto _err1
if not exist %file% goto _err2
ren %file% %newname%
if exist %newname% goto _success
goto _quit:_success
echo 恭喜,成功将%file%更名为%newname%!
goto _quit:_err1
echo 错误:发现重名文件%newname%(From %file%)!
pause
goto _quit:_err2
echo 错误:%file%未找到!
pause
goto _quit:_usage
echo 用法:RenTheFile <要改名的文件全名>
echo 例如:RenTheFile grib2002090712.ctl
pause
goto _quit:_quit
for %%I in (debug file dd hh num newname) do set %%I=上面的批处理基本上是将某一个文件改名,下面的步骤就是对个改名的文件挨个call这个批处理,我就不用再说了吧?



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




积分 307
发帖 58
注册 2004-10-21
状态 离线
『第 7 楼』:  

我接触dos是从2004-10-21,我注册那天开始,在你的热心的帮助下,我才完成了师兄交给我的一个小任务,即grib数据dos下处理,我能给的报酬看来只能是一句话:谢谢你,Climbing。是不是有点失望,呵呵!缘于dos功底太薄,你的程序现在我是看不太懂,我会去研究。以下是我的小程序f:
cd batch_grib_data
copy /y e:\wgrib\grib20* f:\batch_grib_data
del grib20*.ctl
del grib20*.idx
rmdir /s /q ctl
rmdir /s /q index
rmdir /s /q ctlbak
md ctl
md ctl\temp
md index
md ctlbak
for %%c in (grib20*) do grib2ctl %%c > ctl\%%c.ctl
copy /y ctl\grib*  ctlbak                             
                                    
copy /y  ctl\grib* ctl\temp\        
cd ctl                              
dir /b|find "grib20" >files
cd ..
move ctl\files files
type filesfor /f %%c in (files) do sed  -e '93,97d' ctl\temp\%%c >ctl\%%ccd ctl
dir /b  grib20* |lmod /l* cp [] [7,12]> tmp.bat
call tmp.bat
del tmp.bat dir /b 020* >tmp.txt  
for /f %%c in (tmp.txt) do  change %%c /from "^" /to "f:\batch_grib_data\" /lines 1-1 /TEXT
for /f %%c in (tmp.txt) do  change %%c /from "^" /to "f:\batch_grib_data\index\" /lines 2-2 /TEXT
dir /b  020* |lmod /l* copy [] grib20[]> tmp.bat
call tmp.bat
del tmp.bat del 020*
                                                                                                                                         
type grib2002090300.ctl
cd ..
for %%d in (ctl\*.ctl) do d:\Progra~1\PCGrADs\win32\gribmap -v -i %%d -0                                    
f:
cd batch_grib_data
cd proc_ctl
call C:\Cygwin\cygwin.bat< rename.shf:
cd  batch_grib_data\proc_ctlgrads -lbc "run bogus2.gs"
grads -lbc "run uv850.gs"
cd ../../rename.sh 内容(cygwin下批量改名)set -x
set -u
files=13
i=0
x=0cd /cygdrive/f/batch_grib_data/ctl
for fname in `ls -l grib*|awk '{print $9}'`
do
filename=$fname
i=`expr $i + 1`
donewhile [ $x -lt $files ]
do
   m=`expr $x + 1`
   cp "${filename[x]}" ../proc_ctl/"$m".ctl
   x=`expr $x + 1`
done
exit

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

网络独行侠


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

我的批处理主要使用了2k/xp/2003下的新版set命令中增加的取环境变量的子字符串%VAR:~...%及表达式计算的功能。研究一下set命令的使用说明就可以了:显示、设置或删除 cmd.exe 环境变量。SET [variable=[string]]  variable  指定环境变量名。
  string    指定要指派给变量的一系列字符串。要显示当前环境变量,键入不带参数的 SET。如果命令扩展被启用,SET 会如下改变:可仅用一个变量激活 SET 命令,等号或值不显示所有前缀匹配
SET 命令已使用的名称的所有变量的值。例如:    SET P会显示所有以字母 P 打头的变量如果在当前环境中找不到该变量名称,SET 命令将把 ERRORLEVEL
设置成 1。SET 命令不允许变量名含有等号。在 SET 命令中添加了两个新命令行开关:    SET /A expression
    SET /P variable=[promptString]/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式
评估器很简单并以递减的优先权顺序支持下列操作:    ()                  - 分组
    ! ~ -               - 一元运算符
    * / %               - 算数运算符
    + -                 - 算数运算符
    << >>               - 逻辑移位
    &                   - 按位“与”
    ^                   - 按位“异”
    |                   - 按位“或”
    = *= /= %= += -=    - 赋值
      &= ^= |= <<= >>=
    ,                   - 表达式分隔符如果您使用任何逻辑或取余操作符, 您需要将表达式字符串用
引号扩起来。在表达式中的任何非数字字符串键作为环境变量
名称,这些环境变量名称的值已在使用前转换成数字。如果指定
了一个环境变量名称,但未在当前环境中定义,那么值将被定为
零。这使您可以使用环境变量值做计算而不用键入那些 % 符号
来得到它们的值。如果 SET /A 在命令脚本外的命令行执行的,
那么它显示该表达式的最后值。该分配的操作符在分配的操作符
左边需要一个环境变量名称。除十六进制有 0x 前缀,八进制
有 0 前缀的,数字值为十进位数字。因此,0x12 与 18 和 022
相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字,
因为 8 和 9 不是有效的八进制位数。/P 命令行开关允许将变量数值设成用户输入的一行输入。读取输入
行之前,显示指定的 promptString。promptString 可以是空的。环境变量替换已如下增强:    %PATH:str1=str2%会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的
开始到 str1 剩余部分第一次出现的地方,都一直保持相配。也可以为扩展名指定子字符串。    %PATH:~10,5%会扩展 PATH 环境变量,然后只使用在扩展结果中从第 11 个(偏
移量 10)字符开始的五个字符。如果没有指定长度,则采用默认
值,即变量数值的余数。如果两个数字(偏移量和长度)都是负数,
使用的数字则是环境变量数值长度加上指定的偏移量或长度。    %PATH:~-10%会提取 PATH 变量的最后十个字符。    %PATH:~0,-2%会提取 PATH 变量的所有字符,除了最后两个。终于添加了延迟环境变量扩充的支持。该支持总是按默认值被
停用,但也可以通过 CMD.EXE 的 /V 命令行开关而被启用/停用。
请参阅 CMD /?考虑到读取一行文本时所遇到的目前扩充的限制时,延迟环境
变量扩充是很有用的,而不是执行的时候。以下例子说明直接
变量扩充的问题:    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "%VAR%" == "after" @echo If you see this, it worked
    )不会显示消息,因为在读到第一个 IF 语句时,BOTH IF 语句中
的 %VAR% 会被代替;原因是: 它包含 IF 的文体,IF 是一个
复合语句。所以,复合语句中的 IF 实际上是在比较 "before" 和
"after",这两者永远不会相等。同样,以下这个例子也不会达到
预期效果:    set LIST=
    for %i in (*) do set LIST=%LIST% %i
    echo %LIST%原因是,它不会在目前的目录中建立一个文件列表,而只是将
LIST 变量设成找到的最后一个文件。这也是因为 %LIST% 在
FOR 语句被读取时,只被扩充了一次;而且,那时的 LIST 变量
是空的。因此,我们真正执行的 FOR 循环是:    for %i in (*) do set LIST= %i这个循环继续将 LIST 设成找到的最后一个文件。延迟环境变量扩充允许您使用一个不同的字符(惊叹号)在执行
时间扩充环境变量。如果延迟的变量扩充被启用,可以将上面
例子写成以下所示,以达到预期效果:    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "!VAR!" == "after" @echo If you see this, it worked
    )    set LIST=
    for %i in (*) do set LIST=!LIST! %i
    echo %LIST%如果命令扩展被启用,有几个动态环境变量可以被扩展,但
不会出现在 SET 显示的变量列表中。每次变量数值被扩展时,
这些变量数值都会被动态计算。如果用户用这些名称中任何
一个定义变量,那个定义会替代下面描述的动态定义:%CD% - 扩展到当前目录字符串。%DATE% - 用跟 DATE 命令同样的格式扩展到当前日期。%TIME% - 用跟 TIME 命令同样的格式扩展到当前时间。%RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。%ERRORLEVEL% - 扩展到当前 ERRORLEVEL 数值。%CMDEXTVERSION% - 扩展到当前命令处理器扩展版本号。%CMDCMDLINE% - 扩展到调用命令处理器的原始命令行。




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




积分 85
发帖 10
注册 2004-10-2
状态 离线
『第 9 楼』:  

请问6楼的批处理中,%debug%的作用是什么?

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




积分 307
发帖 58
注册 2004-10-21
状态 离线
『第 10 楼』:  

谢谢Climbing,我终于看懂你的程序了,不过通过这种方法也能达到我的要求set files=13
copy ..\ctlbak\grib*
echo. >tmp.bat
lmod
for /l %%i in (1,1,%files%) do dir /b /o ..\ctlbak\grib*|lmod /L%%i ren [] %%i.ctl >>tmp.bat
call tmp.bat

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

网络独行侠


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

Re: ^-^%debug%的作用是用来调试批处理的运行过程的,如果将debug=1,那么就可以显示环境变量运行中的值,置为0就不会显示这么调试信息了。Re: bird你的dos应用进步很快,祝贺!但我的批处理是没有使用第三方程序的,这是跟WillSort兄学的。



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




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

10楼的方法挺巧妙的。



www.51ct.net
2004-11-6 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
cxmzlxb
新手上路





积分 17
发帖 13
注册 2006-9-6
状态 离线
『第 13 楼』:  

到现在还没看懂什么意思!

2006-10-3 01:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 14 楼』:  



  Quote:
Originally posted by tired_bird at 2004-11-3 00:00:
谢谢你的一番话,如何我想把一个文件夹中所有的如grib2002090500.ctlgrib2002090506.ctlgrib2002090512.ctlgrib2002090518.ctlgrib2002090600.ctlgrib2002090606.ctl.......每隔6小时 ...

下面应该是你要的!
@echo off
set/a a=0
for /f %%c in ('dir/on/b grib20*.ctl') do set c=%%c&call :2
goto :eof
:2
set/a a+=1
if EXIST %a%.ctl goto 2
ren %c% %a%.ctl
[ Last edited by qwe1234567 on 2006-10-3 at 05:56 ]



我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-10-3 05:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: