![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-02 04:39 |
共 48,037 主题排行 / 350,122 发帖 / 今日 2 篇 / 48,250 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [求助]请教如何进行批量改名? |
| 可打印版本 2,101 / 13 |
| 第1楼 tired_bird | 发表于 2004-11-02 00:00 |
| 中级用户 发帖 58 积分 307 | |
|
[求助]请教如何进行批量改名? dos下很多软件例如change就不支持长文件名,所以用change进行文本处理之前
就要把很多文件进行重名成他支持的短文件名,我现在有很多如同grib2002090500.ctl 我想把它前面6个字符去掉命名成02090500.ctl,我尝试以下两种方法都不行 for /f %c in (`dir /b |find "grib20"`) ren %c "%c|lmod /l* " ren "dir /b |find "grib20"" "dir /b |find "grib20" |lmod /l* " 都不行 如何写这个批处理呢? |
|
| 第2楼 Climbing | 发表于 2004-11-02 00:00 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
这说明你没有认真学习DOS命令的使用,我已经说过很多次了,DOS不是Linux,不要用Linux的思维习惯来工作于DOS。其实好好研究一下dir和lmod的用法,你的问题是很容易解决的:dir /b grib20*.* | lmod /L* ren > temp.bat
call temp.bat del temp.bat |
|
| 第3楼 tired_bird | 发表于 2004-11-02 00:00 |
| 中级用户 发帖 58 积分 307 | |
|
首先谢谢climbing帮我解决了这个问题。其次作为一个刚学dos的新手来说,不要用Linux的思维习惯来工作于DOS,很难,不过我会努力纠正,争取以后向您尽量少问一些的低级问题。最后还望以后多多指点。
|
|
| 第4楼 Climbing | 发表于 2004-11-03 00:00 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
其实Linux的思维习惯应该是灵活变通,DOS相对于Linux来说,要缺乏一些灵活性,但道理和基础上的东西基本上是一样的。我所谓的Linux思维习惯不是指这个层面,而是指不能把DOS当作Linux来看待,Linux支持的东东DOS未必能够支持,但具体到每个命令的应用却是大同小异的。例如Linux下的ls在DOS里变成了dir,而mv则变成了ren或者move,cp变成了copy,这只是命令名的差异而已(功能上也略有差异,细细研究每一个命令就可以找到差异所在),另外象输入、输出重定向、管道操作这些东西DOS也是有限度的支持的。我觉得如果你是一个可以熟练使用Linux的人,适应起dos来应该是更快的,而不应该是目前这种纠缠于问一些基本的命令使用问题。
|
|
| 第5楼 tired_bird | 发表于 2004-11-03 00:00 |
| 中级用户 发帖 58 积分 307 | |
|
谢谢你的一番话,如何我想把一个文件夹中所有的如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该如何写这个批处理?有急用还望指教!
|
|
| 第6楼 Climbing | 发表于 2004-11-04 00:00 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
@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这个批处理,我就不用再说了吧? |
|
| 第7楼 tired_bird | 发表于 2004-11-05 00:00 |
| 中级用户 发帖 58 积分 307 | |
|
我接触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 > 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 do m=`expr $x + 1` cp "${filename}" ../proc_ctl/"$m".ctl x=`expr $x + 1` done exit |
|
| 第8楼 Climbing | 发表于 2004-11-05 00:00 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
我的批处理主要使用了2k/xp/2003下的新版set命令中增加的取环境变量的子字符串%VAR:~...%及表达式计算的功能。研究一下set命令的使用说明就可以了:显示、设置或删除 cmd.exe 环境变量。SET ] variable 指定环境变量名。
string 指定要指派给变量的一系列字符串。要显示当前环境变量,键入不带参数的 SET。如果命令扩展被启用,SET 会如下改变:可仅用一个变量激活 SET 命令,等号或值不显示所有前缀匹配 SET 命令已使用的名称的所有变量的值。例如: SET P会显示所有以字母 P 打头的变量如果在当前环境中找不到该变量名称,SET 命令将把 ERRORLEVEL 设置成 1。SET 命令不允许变量名含有等号。在 SET 命令中添加了两个新命令行开关: SET /A expression SET /P variable=/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% - 扩展到调用命令处理器的原始命令行。 |
|
| 第9楼 ^_^ | 发表于 2004-11-05 00:00 |
| 初级用户 发帖 10 积分 85 | |
|
请问6楼的批处理中,%debug%的作用是什么?
|
|
| 第10楼 tired_bird | 发表于 2004-11-05 00:00 |
| 中级用户 发帖 58 积分 307 | |
|
谢谢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 |
|
| 第11楼 Climbing | 发表于 2004-11-05 00:00 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
Re: ^-^%debug%的作用是用来调试批处理的运行过程的,如果将debug=1,那么就可以显示环境变量运行中的值,置为0就不会显示这么调试信息了。Re: bird你的dos应用进步很快,祝贺!但我的批处理是没有使用第三方程序的,这是跟WillSort兄学的。
|
|
| 第12楼 死性不改 | 发表于 2004-11-06 00:00 |
| 中级用户 发帖 88 积分 378 | |
|
10楼的方法挺巧妙的。
|
|
| 第13楼 cxmzlxb | 发表于 2006-10-03 01:55 |
| 新手上路 发帖 13 积分 17 | |
|
到现在还没看懂什么意思!
|
|
| 第14楼 不得不爱 | 发表于 2006-10-03 05:52 |
| 超级版主 发帖 2,044 积分 5,310 来自 四川南充 | |
Originally posted by tired_bird at 2004-11-3 00:00: 下面应该是你要的! [ Last edited by qwe1234567 on 2006-10-3 at 05:56 ] |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |