| 
 
tired_bird 
中级用户
 
   
 
  
 
积分 307 
发帖 58 
注册 2004-10-21 
状态 离线
 | 
『楼 主』:
 [求助]请教如何进行批量改名?
 
使用 LLM 解释/回答一下
  
      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* " 
都不行 
如何写这个批处理呢? 
 
    
 
  
 |   
 | 
  2004-11-2 00:00 | 
  
 | 
 | 
 
Climbing 
铂金会员
 
        网络独行侠
  
 
积分 6962 
发帖 2753 
注册 2003-4-16 来自 河北保定 
状态 离线
 | 
『第 2 楼』:
 
 
使用 LLM 解释/回答一下
  
这说明你没有认真学习DOS命令的使用,我已经说过很多次了,DOS不是Linux,不要用Linux的思维习惯来工作于DOS。其实好好研究一下dir和lmod的用法,你的问题是很容易解决的:dir /b grib20*.* | lmod /L* ren   > temp.bat 
call temp.bat 
del temp.bat 
 
 
 
    
 
  
  |  
                  
  
                    偶只喜欢回答那些标题和描述都很清晰的帖子! 
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人! 
 |   
 | 
  2004-11-2 00:00 | 
  
 | 
 | 
 
tired_bird 
中级用户
 
   
 
  
 
积分 307 
发帖 58 
注册 2004-10-21 
状态 离线
 | 
『第 3 楼』:
 
 
使用 LLM 解释/回答一下
  
首先谢谢climbing帮我解决了这个问题。其次作为一个刚学dos的新手来说,不要用Linux的思维习惯来工作于DOS,很难,不过我会努力纠正,争取以后向您尽量少问一些的低级问题。最后还望以后多多指点。 
 
    
 
  
 |   
 | 
  2004-11-2 00:00 | 
  
 | 
 | 
 
Climbing 
铂金会员
 
        网络独行侠
  
 
积分 6962 
发帖 2753 
注册 2003-4-16 来自 河北保定 
状态 离线
 | 
『第 4 楼』:
 
 
使用 LLM 解释/回答一下
  
其实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 楼』:
 
 
使用 LLM 解释/回答一下
  
谢谢你的一番话,如何我想把一个文件夹中所有的如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 楼』:
 
 
使用 LLM 解释/回答一下
  
@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 楼』:
 
 
使用 LLM 解释/回答一下
  
我接触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  
 
    
 
  
 |   
 | 
  2004-11-5 00:00 | 
  
 | 
 | 
 
Climbing 
铂金会员
 
        网络独行侠
  
 
积分 6962 
发帖 2753 
注册 2003-4-16 来自 河北保定 
状态 离线
 | 
『第 8 楼』:
 
 
使用 LLM 解释/回答一下
  
我的批处理主要使用了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% - 扩展到调用命令处理器的原始命令行。 
 
 
    
 
  
  |  
                  
  
                    偶只喜欢回答那些标题和描述都很清晰的帖子! 
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人! 
 |   
 | 
  2004-11-5 00:00 | 
  
 | 
 | 
 
^_^ 
初级用户
 
  
 
  
 
积分 85 
发帖 10 
注册 2004-10-2 
状态 离线
 | 
 | 
  2004-11-5 00:00 | 
  
 | 
 | 
 
tired_bird 
中级用户
 
   
 
  
 
积分 307 
发帖 58 
注册 2004-10-21 
状态 离线
 | 
『第 10 楼』:
 
 
使用 LLM 解释/回答一下
  
谢谢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 楼』:
 
 
使用 LLM 解释/回答一下
  
Re: ^-^%debug%的作用是用来调试批处理的运行过程的,如果将debug=1,那么就可以显示环境变量运行中的值,置为0就不会显示这么调试信息了。Re: bird你的dos应用进步很快,祝贺!但我的批处理是没有使用第三方程序的,这是跟WillSort兄学的。 
 
    
 
  
  |  
                  
  
                    偶只喜欢回答那些标题和描述都很清晰的帖子! 
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人! 
 |   
 | 
  2004-11-5 00:00 | 
  
 | 
 | 
 
死性不改 
中级用户
 
   
 
  
 
积分 378 
发帖 88 
注册 2004-5-5 
状态 离线
 | 
 | 
  2004-11-6 00:00 | 
  
 | 
 | 
 
cxmzlxb 
新手上路
 
 
 
  
  
积分 17 
发帖 13 
注册 2006-9-6 
状态 离线
 | 
 | 
  2006-10-3 01:55 | 
  
 | 
 | 
 
不得不爱 
超级版主
 
          我爱DOS
  
 
积分 5310 
发帖 2044 
注册 2005-9-26 来自 四川南充 
状态 离线
 | 
『第 14 楼』:
 
 
使用 LLM 解释/回答一下
  
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 | 
  
 |