Rexdf

The devil is in the Details.

批处理文件操作杂记

| Comments

由于某些原因,一些文件夹出现了前缀..和后缀.hider.hider,而且文件加里包含文件夹和文件,应该是肯定在1000的工作量的,尝试用纯的批处理写出来,不过一直到最后都还是没有弄明白用什么办法可以刚刚把匹配后的字符串取出来,应该用正则可以办到,但是没有找到系统介绍批处理中正则的资料,故想写一个c++程序来处理。无奈,不调用复杂的系统API似乎还是很难做到(我还没系统研究io.h和direct.h里面到底包含哪些函数),而WinAPI似乎总是希望传达你一个宏大的思想,需要注意的细节太多。 最总写成了如下版本的两个文件,先是批处理

@echo off&setlocal enabledelayedexpansion

PATH I:\tmp\Orginal\
a.exe
for /r %%a in (dir /ad) do (

     cd %%~pa
     a.exe
)


#include   <stdio.h> 
#include   <io.h> 
#include   <direct.h> 
#include <cstring>
#include <iostream>


using namespace std;


typedef   struct   _finddata_t   file_block; 

int main() 
{ 
    file_block   f_block; 
    long   handle,retcode; 
    int flag;
    handle=_findfirst("*",&f_block); 
    do{
        printf( "%-12s\n ",f_block.name);
        char tmp[1505],fn[1257];
        strcpy(fn,f_block.name);
        flag=1;
        while(fn[0]=='.')
        {
            int l=strlen(fn);
            for(int i=1;i<=l;i++)
              fn[i-1]=fn[i];
            flag=0;
        }
        {
            int len=strlen(fn);
            for(int i=0;i<len-1;i++)
              if(fn[i]=='.' && fn[i+1]=='h' && fn[i+2]=='i' && fn[i+3]=='d'
                 && fn[i+4]=='e' && fn[i+5]=='r')
                 fn[i]='\0',flag=0;
        }
        /*
        if(flag)
        {
            cout<<fn<<endl;
            continue;
        }
        */
        strcpy(tmp,"ren \"");
        strcat(tmp,f_block.name);
        strcat(tmp,"\" \"");
        strcat(tmp,fn);
        strcat(tmp,"\"");
        cout<<"$"<<tmp<<endl;
        system(tmp);
        retcode=_findnext(handle,&f_block); 
    }while(retcode==0); 
    printf( "\n   end   of   diretory\n "); 
    //system("pause");
    return 0;
}

另外附一份批处理的资料

批处理文件小结因为很多游戏资源的处理都是通过DOS批处理文件来进行的,所以必须要了解批处理文件的语法。下面把比较重要的内容一一列举出来。
注意command.com和cmd.exe是不同的东西。command.com是MS-DOS的命令解释器(shell),没有它,大部分的Windows系统都是无法引导的,从MS-DOS到WinXP都需要它。cmd.exe是更高级的shell,它提供了许多环境变量,支持的平台是WinNT、Win2K、WinXP、Vista和Win7。而且二者的命令行参数也是不一样的。
下面所说的都是基于cmd.exe的。

>>> @
描述:从 DOS 3.3 开始,可以用它来隐藏DOS命令的显示。注意,只是隐藏命令,并不会隐藏命令的输出。
语法:放在任何DOS命令前面;也可以放在批处理文件名的前面。
示例:
@echo OFF 将隐藏这七个后续字母的显示

>>> %0 - %9
描述:用于引用命令行上的参数。
语法:%0是命令行的批处理命令。%1 - %9是后面的九个参数。
示例:
E:\MYBATCH DOC A: 命令行
COPY *.%1 %2      MYBATCH.BAT文件内容:只有一行。复制所有的DOC文件到软驱。

>>> %variable%
描述:引用变量。比较简单,直接示例。
示例:
echo The current search path is: %PATH%
set USER=John
if %USER%==John goto LABEL

当Command Extensions启用时,有下面几个系统变量:
echo %cd%             显示当前目录。如果当前目录是各个驱动器的根目录,则后面有反斜杠\;反之则没有。
echo %date%
echo %time%
echo %random%         0到32767之间的随机数
echo %errorlevel%     见下文
echo %cmdextversion%  见下文
echo %cmdcmdline%     命令行

变量值替换:
@echo OFF
set USER_PROMPT=Please input a string:
echo %USER_PROMPT:~7,5%       变量值的临时替换。offset=7,length=5。也就是input这五个字母。
echo %USER_PROMPT:~7%         不指定length,则默认是后面全部。也就是 input a string: 这一大串。
echo %USER_PROMPT:~-7%        offset为负值,则从后往前数。length还是往后全部。也就是string:这七个字母。
echo %USER_PROMPT:~-7,6%      length为6,则为string这六个字母。
echo %USER_PROMPT%            原来的变量值不变。
pause

延迟变量展开:
@echo off
set VAR=before
if "%VAR%" == "before" (
set VAR=after
echo %VAR%                    会输出什么?很大可能是before,而不是after。因为默认情况下,“延迟变量展开”(delayed environment variable expansion)是禁用的。
)
一般来说,这可不是我们想要的。因为默认情况下,cmd.exe在读入批处理文件之后,立刻把变量VAR全部展开成before了,然后才开始执行脚本。
cmd.exe的/v开关可以打开,以支持“延迟变量展开”,使得变量可以在执行阶段变化。然后变量的使用也要变化:
@echo off
set VAR=before
if "%VAR%" == "before" (
set VAR=after
echo !VAR!                  此时会输出after。
echo %VAR%                  还是输出before。
)

同样,下面的程序:
set FILE_LIST=
for %i in (*) do set FILE_LIST=!FILE_LIST! %i
echo !FILE_LIST!              输出当前目录的所有文件
echo %FILE_LIST%              也输出当前目录的所有文件,为什么?

可以用setlocal enabledelayedexpansion在批处理文件中打开该选项。

>>> echo
描述:控制DOS命令与注释的显示与否。
语法:echo [ON|OFF|message|.]
示例:
echo  显示当前echo状态是开是关
echo ON | OFF 不言自明
echo Processing... 在屏幕上显示 Processing... 这条消息
echo %USER%  在屏幕上显示 USER 变量的值
echo.  显示一个空行
echo Y|Del *.*  删除所有文件,在问:Are you sure 的时候,用Y来响应。

>>> call
描述:调用别的批处理文件。
语法:
从 DOS 3.3 开始:call [drive:][path]filename [batch-parameters]
DOS 3.3 以前的版本:command /c [drive:][path]filename [batch-parameters]

>>> for
描述:最重要的命令之一。很复杂。所以,下面的语法和示例要搀在一起来讲,就叫“用法”吧。
用法:它可以直接应用于命令行,当然也可以用于批处理文件内部。但是二者的使用是有差别的。
命令行的语法格式:FOR %variable IN (set) DO command [command-parameters]
1> 注意,其参数格式是%variable,如果用于批处理文件,则为%%variable。
2> variable是从a到z的字母,大小写敏感。
3> set是一个或多个文件。互相之间用空格或逗号隔开。支持通佩符。
例:
for %%i in (A,C,D) do dir %%i *.* 显示这几个驱动器的所有文件
for %%i in (*.*) do @echo %%i 显示当前目录的所有文件

当cmd.exe的 command extensions 开关打开时(默认就是打开),for命令还支持 /D /R /L /F 四个选项(大小写不敏感)。

/D
描述:目录操作
语法:FOR /D %variable IN (set) DO command [command-parameters]
示例:
for /d %%i in (*) do @echo %%i 显示当前目录的所有子目录
for /d %%i in ("%cd%\*") do @echo %%i 显示这些子目录的完整路径,加上双引号是为了表示带空格的目录,如果%cd%带空格的话。
for /d %%i in (c:\*) do @echo %%i 显示c盘下所有子目录
for /d %%i in (???) do @echo %%i 显示只有1-3个字母的目录

/R
描述:大概是recursive的意思。会递归遍历文件夹。
语法:FOR /R [[drive:]path

Comments