|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
^_^
初级用户
 
积分 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 |
|
|
死性不改
中级用户
  
积分 378
发帖 88
注册 2004-5-5
状态 离线
|
『第
12 楼』:
10楼的方法挺巧妙的。
|

www.51ct.net |
|
2004-11-6 00:00 |
|
|
cxmzlxb
新手上路

积分 17
发帖 13
注册 2006-9-6
状态 离线
|
|
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 |
|