代码改变世界

cmd Batch Dos常用收集

2012-07-12 02:01  youxin  阅读(815)  评论(0编辑  收藏  举报

 

   批处理,顾名思义就是进行批量的处理。批处理文件是扩展名为。bat 或。cmd的文本文件,包含一条或多条命令,由DOS或Windows系统内嵌的命令解释器来解释运行。

 批处理的本质,是一堆DOS命令按一定顺序排列而形成的集合。

 批处理,也称为批处理脚本,英文译为BATCH,批处理文件后缀BAT就取的前三个字母。它的构成没有固定格式,只要遵守以下这条就ok了:每一行可视为一个命令,每个命令里可以含多条子命令,从第一行开始执行,直到最后一行结束,它运行的平台是DOS。批处理有一个很鲜明的特点:使用方便、灵活,功能强大,自动化程度高。

.bat是dos下的批处理文件 
.cmd是nt内核命令行环境的另一种批处理文件 
从 更广义的角度来看,unix的shell脚本以及其它操作系统甚至应用程序中由外壳进行解释执行的文本,都具有与批处理文件十分相似的作用,而且同样是由 专用解释器以行为单位解释执行,这种文本形式更通用的称谓是脚本语言。所以从某个程度分析,batch, unix shell, awk, basic, perl 等脚本语言都是一样的,只不过应用的范围和解释的平台各有不同而已。甚至有些应用程序仍然沿用批处理这一称呼,而其内容和扩展名与dos的批处理却又完全 不同。 

  首先批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分时候就好象我们在DOS提示符下执行的命令行一样),你可以使用DOS下的Edit或者Windows的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件。 

  批 处理文件中完全可以使用非dos命令,甚至可以使用不具有可执行特性的普通数据性文件,这缘于windows系统这个新型解释平台的涉入,使得批处理的应 用越来越"边缘化"。所以我们讨论的批处理应该限定在dos环境或者命令行环境中,否则很多观念和设定都需要做比较大的变动。 

  其 次,批处理文件是一种简单的程序,可以通过条件语句(if)和流程控制语句(goto)来控制命令运行的流程,在批处理中也可以使用循环语句(for)来 循环执行一条命令。当然,批处理文件的编程能力与C语言等编程语句比起来是十分有限的,也是十分不规范的。批处理的程序语句就是一条条的DOS命令(包括 内部命令和外部命令),而批处理的能力主要取决于你所使用的命令。 

  批 处理文件(batch file)也可以称之为批处理程序(batch program),这一点与编译型语言有所不同,就c语言来说,扩展名为c或者cpp的文件可以称之为c语言文件或者c语言源代码,但只有编译连接后的 exe文件才可以称之为c语言程序。因为批处理文件本身既具有文本的可读性,又具有程序的可执行性,这些称谓的界限是比较模糊的。 


   第 三,每个编写好的批处理文件都相当于一个DOS的外部命令,你可以把它所在的目录放到你的DOS搜索路径(path)中来使得它可以在任意位置运行。一个 良好的习惯是在硬盘上建立一个bat或者batch目录(例如C:\BATCH),然后将所有你编写的批处理文件放到该目录中,这样只要在path中设置 上c:\batch,你就可以在任意位置运行所有你编写的批处理程序。 

   纯以dos系统而言,可执 行程序大约可以细分为五类,依照执行优先级由高到低排列分别是:DOSKEY宏命令(预先驻留内存),COMMAND.COM中的内部命令(根据内存的环 境随时进驻内存),以com为扩展名的可执行程序(由command.com 直接载入内存),以exe位扩展名的可执行程序(由command.com 重定位后载入内存),以bat位扩展名的批处理程序(由command.com 解释分析,根据其内容按优先级顺序调用第2,3,4,5种可执行程序,分析一行,执行一行,文件本身不载入内存) 

   

batch注释:

在批处理中,段注释有一种比较常用的方法:

    goto start
     = 可以是多行文本,可以是命令
     = 可以包含重定向符号和其他特殊字符
     = 只要不包含 :start 这一行,就都是注释
    :start


另外,还有其他各种注释形式,比如:
 

   1、:: 注释内容(第一个冒号后也可以跟任何一个非字母数字的字符)

(在BAT中以二个冒号开头的一行为注释,::只能注释一行,且必须在一行的开头
如:
:: This is a comment
:: copy a file to somewhere


    2、rem 注释内容(不能出现重定向符号和管道符号) (rem  注释内容. )
    3、echo 注释内容(不能出现重定向符号和管道符号)〉nul
    4、if not exist nul 注释内容(不能出现重定向符号和管道符号)
    5、:注释内容(注释文本不能与已有标签重名)
    6、%注释内容%(可以用作行间注释,不能出现重定向符号和管道符号)
    7、goto 标签 注释内容(可以用作说明goto的条件和执行内容)
    8、:标签 注释内容(可以用作标签下方段的执行内容)

 

 

 

@  命令行回显屏蔽符:关闭当前行回显

 ECHO OFF可以关闭掉整个批处理命令的回显

@echo off

“echo off”也是命令,它本身也会显示,如果连这条也不显示,就在前面加个“@”。

 

问题:如何启动多个程序?

@echo off
echo Starting QQ...
D:\Program Files\QQ\qq.exe
echo Starting WangWang...
D:\Program Files\WangWang\WangWang.exe
echo Starting Gtalk...
D:\Program Files\Gtalk\googletalk.exe
exit

双击 xx.bat 的运行结果是只运行了 QQ 就停下来了, 因为 Dos 是单任务运行方式,你得关掉最新运行的 QQ 才能继续执行下面的命令…

解决方法,使用start

@echo off
echo Starting 

cd server1
start server1.exe

cd ../server2
start server2.exe

cd ../server3
start server3.exe



cd ../

.bat目录下面有server1和server2,server3目录,各有可执行文件。进入目录后start,然后返回上层。

 (经过多次实验,发现有个小问题,server1,server2,server3偶尔在任务栏不会按照batch文件写的顺序,偶尔有些在前有些在后。让每次只需start后sleep一下。

sleep 秒数
sleep -m  xx -m表示毫秒,sleep -m 500表示休息半秒).

 

 

Start 命令
启动单独的“命令提示符”窗口来运行指定程序或命令。如果在没有参数的情况下使用,start 将打开第二个命令提示符窗口。 

语法 
start ["title"] [/dPath] [/i] [/min] [/max] [{/separate | /shared}] [{/low | /normal | /high | /realtime | /abovenormal | belownormal}] [/wait] [/b] [FileName] [parameters] 

参数 
"title" 指定在“命令提示符”窗口标题栏中显示的标题。 
/dpatch 指定启动目录。 
/i 将 Cmd.exe 启动环境传送到新的“命令提示符”窗口。 
/min 启动新的最小化窗口。 
/max 启动新的最大化窗口。 
/separate 在单独的内存空间启动 16 位程序。 
/shared 在共享的内存空间启动 16 位程序。 
/low 以空闲优先级启动应用程序。 
/normal 以一般优先级启动应用程序。 
/high 以高优先级启动应用程序。 
/realtime 以实时优先级启动应用程序。 
/abovenormal 以超出常规优先级的方式启动应用程序。 
/belownormal 以低出常规优先级的方式启动应用程序。 
/wait 启动应用程序,并等待其结束。 
/b 启动应用程序时不必打开新的“命令提示符”窗口。除非应用程序启用 CTRL+C,否则将忽略 CTRL+C 操作。使用 CTRL+BREAK 中断应用程序。 
非执行文件只要将文件名作为命令键入,即可通过其文件关联运行该文件。有关使用 assoc 和 ftype 在命令脚本中创建这些关联的详细信息,请参阅“”。 
在运行的命令的第一个标记为“CMD”字符串但不包括扩展名或路径限定符时,“CMD”将被 COMSPEC 变量的值取代。这样可以防止用户从当前目录选取 cmd。 
当您运行 32 位图形用户界面 (GUI) 应用程序时,cmd 不会在返回到命令提示符之前等待应用程序退出。如果从命令脚本运行应用程序,则不会发生这种新情况。在运行的命令中第一个符号不包括扩展名的情况下,Cmd.exe 使用 PATHEXT 环境变量的值确定要查找的扩展名以及查找顺序。PATHEXT 变量的默认值为:COM;.EXE;.BAT;.CMD(语法与 PATH 变量相同,使用分号分开不同元素)。当您搜索可执行文件且在任何扩展名上都没有匹配项时,start 将搜索目录名。 

具体例子: 

说明:如果你所在程序的路径中带有空格,那么必须用“”把路径括起来,否则系统会提示找不到XX文件,另外,在运行某些程序时,需在路径的前面加一对空白的“”,表示创建一个空白的窗口,它指向的程序是XXXXXXXX。还有就是别忘了空格。 

当我想运行位于“D:/draw/”的“photoshop.exe”使,应该使用以下命令: 
start “”“D:/draw/photoshop.exe” 表示以常规窗口运行程序 

如果想让程序以最大化窗口运行,则使用以下命令: 

start /max“”“D:/draw/photoshop.exe” 表示以最大化窗口运行程序 

最小化这是这样: 

start /min "" "D:/draw/photoshop.exe" 表示以最小化窗口运行程序 

等待某个程序允许完毕,也就是窗口关闭后,再打开下一个程序这可以这样: 

start /w "" "D:/draw/photoshop.exe" 
start "" cmd.exe

  

关闭某个窗口

 

taskkill /F /FI "WINDOWTITLE eq 窗口标题"          这里是/FI,filter

taskkill /F /IM notepad.exe 注意这里是IM , image name 

C:\Documents and Settings\Administrator>taskkill /?

TASKKILL [/S system [/U username [/P [password]]]]
         { [/FI filter] [/PID processid | /IM imagename] } [/F] [/T]

描述:
    这个命令行工具可用来结束至少一个进程。
    可以根据进程 id 或图像名来结束进程。

参数列表:
    /S    system           指定要连接到的远程系统。

    /U    [domain\]user    指定应该在哪个用户上下文
                           执行这个命令。

    /P    [password]       为提供的用户上下文指定
                           密码。如果忽略,提示输入。

    /F                     指定要强行终止
                           进程。

    /FI   filter           指定筛选进或筛选出查询的
                           的任务。

    /PID  process id       指定要终止的进程的
                           PID。

    /IM   image name       指定要终止的进程的
                           图像名。通配符 '*'
                           可用来指定所有图像名。

    /T                     Tree kill: 终止指定的进程
                           和任何由此启动的子进程。

    /?                     显示帮助/用法。

筛选器:
    筛选器名      有效运算符                有效值
    -----------   ---------------           --------------
    STATUS        eq, ne                    运行 | 没有响应
    IMAGENAME     eq, ne                    图像名
    PID           eq, ne, gt, lt, ge, le    PID 值
    SESSION       eq, ne, gt, lt, ge, le    会话编号
    CPUTIME       eq, ne, gt, lt, ge, le    CPU 时间,格式为
                                            hh:mm:ss。
                                            hh - 时,
                                            mm - 钟,ss - 秒
    MEMUSAGE      eq, ne, gt, lt, ge, le    内存使用,单位为 KB
    USERNAME      eq, ne                    用户名,格式为
                                            [domain\]user
    MODULES       eq, ne                    DLL 名
    SERVICES        eq, ne                    服务名
    WINDOWTITLE     eq, ne                    窗口标题

注意: 只有带有筛选器的情况下,才能跟 /IM 切换使用通配符 '*'。

注意: 远程进程总是要强行终止,
      不管是否指定了 /F 选项。

例如:
    TASKKILL /S system /F /IM notepad.exe /T
    TASKKILL /PID 1230 /PID 1241 /PID 1253 /T
    TASKKILL /F /IM notepad.exe /IM mspaint.exe
    TASKKILL /F /FI "PID ge 1000" /FI "WINDOWTITLE ne untitle*"
    TASKKILL /F /FI "USERNAME eq NT AUTHORITY\SYSTEM" /IM notepad.exe
    TASKKILL /S system /U domain\username /FI "USERNAME ne NT*" /IM *
    TASKKILL /S system /U username /P password /FI "IMAGENAME eq note*"

 

总结,我们关闭多个程序,可以写成

@echo off
taskkill /F /IM "server1.exe"

taskkill /F /IM "server2.exe"

taskkill /F /IM "server3.exe"

 

标准用法:

taskkill /f /t /im redis-server.exe 

start /min "" "redis-server.exe" redis.conf

 

教学网站:

http://commandwindows.com/batch.htm

http://www.cnblogs.com/smwikipedia/archive/2009/03/30/1424735.html

 

http://clover520.blogbus.com/logs/38535338.html

 

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/batch.mspx?mfr=true官方

 

http://www.ss64.com/nt/

http://www.netikka.net/tsneti/http/tsnetihttpprog.php#cmdscript

http://www.robvanderwoude.com/

http://www.dostips.com/DtTipsXCopy.php good

http://www.cn-dos.net/forum/forumdisplay.php?fid=12  中国DOS联盟

http://www.cn-dos.net/forum/viewthread.php?tid=44122 教程
http://tech.163.com/special/000915SN/sthackerdos.html  视频

 参考:http://zww.me/archives/25386

 

 CMD中Pushd和Popd命令的用法

Pushd和Popd命令,这两个命令一般都是同时使用,意思就是Push和Pop 

Pushd 命令 
改变当前目录到指定目录,并保存当前的目录在堆栈顶端 

Popd 命令 
改变当前目录,跳转到堆栈顶端保存的目录,并将堆栈顶端的目录删除 


使用 Pushd 命令后,就会将当前目录储存到一个虚拟堆栈中,如果第一次使用 Pushd 命令,该命令所在的目录就会被置于栈底,如再次使用该命令,则第二个目录就会被置于第一个目录之上。 

使用 Popd 命令,将当前目录更改为最近由 Pushd 命令存储的目录,并位于堆栈顶端的目录将从堆栈中删除。 


@Echo Off 
Echo 当前目录:%cd% 
pushd C:\Intel\Logs 
Echo 当前目录:%cd% 
pushd C:\Download 
Echo 当前目录:%cd% 
pushd C:\WINDOWS 


Echo 当前目录:%cd% 
popd 
Echo 当前目录:%cd% 
popd 
Echo 当前目录:%cd% 
popd 
Echo 当前目录:%cd% 
Pause

 

dos goto

动用流程跳转语句 goto 了。流程跳转的含义是:改变默认的执行顺序,强制跳转到指定的位置执行特定的程序块。 

  先来看个例子:假设需要判断用户输入的是A还是B,代码可以写成这样: 
@echo off 
set /p input=请输入字母A或B: 
if "%input%"=="A" goto A 
if "%input%"=="B" goto B 
pause 
exit 

:A 
echo 您输入的字母是A 
pause 
exit 

:B 
echo 您输入的字母是B 
pause 
exit 

 

一、set的主要作用是赋值
1、set /p a=promptstring
先显示promptstring,再接受用户输入的内容,以回车表示结束,赋值给变量a

 

dos if 条件判断

 

 

dos命令中for /r和for /d的简单用法

1.for /r主要用于搜索指定路径及其所有子目录中符合要求的文件(/r后如果没有指定目录,则使用当前目录)
将E:\gp下的*.txt文件修改后缀名为.doc文件
@echo off 
for /r "E:\gp" %%a in (*.txt)do ren "%%a" "%%~na.doc"

pause
---------------------
 .for /d用于搜索目录或文件夹(不搜索文件),而且只搜索指定目录,不搜索子目录


原文:https://blog.csdn.net/ab7434588/article/details/53055890  

 

 

for帮助文档

对一组文件中的每一个文件执行某个特定命令。 

FOR %variable IN (set) DO command [command-parameters] 

%variable 指定一个单一字母可替换的参数。 
(set) 指定一个或一组文件。可以使用通配符。 
command 指定对每个文件执行的命令。 
command-parameters 
为特定命令指定参数或命令行开关。 

在批处理程序中使用 FOR 命令时,指定变量请使用 %%variable 
而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I. 

如果命令扩展被启用,下列额外的 FOR 命令格式会受到 
支持: 

FOR /D %variable IN (set) DO command [command-parameters] 

如果集中包含通配符,则指定与目录名匹配,而不与文件 
名匹配。 

FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters] 

检查以 [drive:]path 为根的目录树,指向每个目录中的 
FOR 语句。如果在 /R 后没有指定目录,则使用当前 
目录。如果集仅为一个单点(.)字符,则枚举该目录树。 

 

dos命令行或批处理中变量一个百分号和两个百分号的区别

for 命令的基本语法如下:

  在cmd窗口中:for %I in (command1) do command2
  在批处理文件中:for %%I in (command1) do command2

      上面的变量有%I和%%I两种,分别是一个百分号和两个百分号,单个百分号变量用于cmd窗口命令行,两个百分号变量用于批处理文件。

  在cmd窗口中,for之后的形式变量I必须使用单百分号引用,即%I;而在批处理文件中,引用形式变量I必须使用双百分号,即%%I。如果把单个百分号用于批处理文件,则会报“命令语法不正确”的错误
---------------------
 
原文:https://blog.csdn.net/aolia2000/article/details/6885907
 

 

批处理清理VS工程目录(递归删除Debug, Release, ipch目录及*.sdf文件)

https://blog.csdn.net/xzz_hust/article/details/9304233

@echo off
setlocal enabledelayedexpansion  
 
for /r . %%a in (Debug) do (  
  if exist %%a (
  echo "delete" %%a
  rd /s /q "%%a" 
 )
)
 
for /r . %%a in (Release) do (  
  if exist %%a (
  echo "delete" %%a
  rd /s /q "%%a" 
 )
)
 
for /r . %%a in (ipch) do (  
  if exist %%a (
  echo "delete" %%a
  rd /s /q "%%a" 
 )
)
 
for /r . %%a in (*.sdf) do (  
  if exist %%a (
  echo "delete" %%a
  del "%%a" 
 )
)
 
pause

--------------------- 
作者:xuzhezhaozhao 
来源:CSDN 
原文:https://blog.csdn.net/xzz_hust/article/details/9304233 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

dos del命令:

window下批量删除指定后缀文件

批量删除当前路径下后缀为 .jpg和 .json

del /a /f /s /q  "*.jpg" "*.json"

 

 

for:

 for /f “选项” %变量 in ( “字符串”-集 ) do 命令 

 四、参数 /f 
这个参数/f将会打开(集)里的文件,使for命令能处理文本文件的读取和添加删除替换等编辑性的操作,可谓功能强大,因此也相对复杂一些。 
文件名-集 
for /f “选项” %变量 in ( “字符串”-集 ) do 命令 
‘命令'-集 
/f 后可以带有几种选项,不带选项当然也是合格的格式,而带有参数则必须以引号整体括起来,后面的集里主要由三种形式形成的,最终在for循环中的每一轮中会形成读取一行字符串,来给指定的%变量、以及给由于选项中派生出附加变量赋值后,执行do后面的命令 
下面以例子来具体说明和逐步理解各分项的用法 
例6 
假定d:\abc.txt内容如下: 
姓名 性别 年龄 等-级 
张三 男 36 A-1 
李四 男 29 B-2 

赵六 女 31 A-2 

执行如下命令: 
for /f %c in (d:\abc.txt) do @echo %c 
则屏幕上显示: 
姓名 
张三 
李四 
赵六 

解释:这是for /r 在“%变量”前缺省参数选项时的情况,循环中每轮会默认以空格为分隔,在打开的文件中逐行给字符串分段,又因为没给增添附加变量(即仅一个变量%c)则仅把第一段的字符赋给%c,再执行 do后的命令,然后进行循环的下一轮,并且默认忽略空行 
改一下: 
for /f “skip=1 tokens=1,4 delims= ” %c in(d:\abc.txt) do @echo %c %d 
显示为: 
张三 A-1 
李四 B-2 
赵六 A-2 

解: 
skip=1 表示文本开始忽略的行数为1 ——忽略几行 
delims= 在一行中,用什么单个符号(可以有多字符组合,之间也不能加空格,被理解为多项单个字符,如要空格符须放最后)来分隔字符串作为读取赋值的单元(形成一段),本例中等号后是空的表示仅用空格来分隔。——用什么刀来切分 
tokens=1,4 这个等号后的数字表示依次取第几个被分隔的字符串段,来分别赋给%变量及顺序附加的变量,本例取第1个段赋给%c,第4个段赋给c后的一个变量也就是赋给%d,并且,可以写成tokens=1,2,5-7或tokens=1,2,3* 或tokens=1,2,5,7分别表示取第1,2,5,6,7(依次赋给%c, %d, %e, %,f, %g共5个变量)、1,2,3及3后的所有段(要赋给3个变量)、1,2,5,7(要赋给4个变量),tokens=后的数字号可以不按顺序,但书写的顺序与分配给变量的顺序是对应的,这是赋值,至于之后do命令中用不用是另一回事。换句话 ­­——最多只需取哪几段 
in (变量) 中的那个变量,代表起始的一个变量名,按tokens中定义的总个数来扩充附加变量名,如总个数为3,则%c 就附加%d和%e ,要是%C就附加%D%E… 本例中tokens=1,4仅需两个,起始的是in () 括号中的%c 则每行中第一段赋给%c,第4段赋给变量%d 
以第二行(第一行被skip=1跳过了)为例,在 “张三 男 36 A-1 ” 中(正好也是用的空格分隔)共被空格之刀切为五段,只要第1、4,即张三赋给%c, A-1赋给%d,执行@echo %c %d然后下一轮…而空行照旧被省去了。 

再稍改一下: 

for /f “skip=1 tokens=4,1 delims=- “ %c in(d:\abc.txt) do @echo %c %d 

则显示为: 
A 张三 
B 李四 
A 赵六 

 

 

Bat 处理字符串分割 (split功能)

 

最近有有个小需求需要将shell 脚本的功能挪到windows中,但发现shell中有数组概念,但windows中却没有,同时shell中有很多方式处理字符串分割,但bat中就显得比较鸡肋,经过一番查找,终于有了方案(Stack Overflow:http://stackoverflow.com/questions/1707058/how-to-split-a-string-in-a-windows-batch-file):

方案: 通过for循环处理,而处理的方式又可以分两种,一种是普通for,一种是for的文件处理方式:

 

方案一:

    

@echo off & setlocal
rem 注意这里的s定义,其值不是使用双引号引起来的
rem  also works for comma-separated lists, e.g. ABC,DEF,GHI,JKL
set s=AAA BBB CCC DDD EEE FFF
for %%a in (%s%) do echo %%a
 

方案二:is the best for (most) arbitrary delimiter characters.

@echo off & setlocal
set s=AAA BBB CCC DDD EEE FFF
set t=%s%
:loop
for /f "tokens=1*" %%a in ("%t%") do (
   echo %%a
   rem 将截取剩下的部分赋给t,其实这里可以使用延迟变量开关
   set t=%%b
   )
if defined t goto :loop
 

有个老兄给了个更完整的(用到了延迟变量):

@echo off
setlocal ENABLEDELAYEDEXPANSION

REM Set a string with an arbitrary number of substrings separated by semi colons
set teststring=The;rain;in;spain

REM Do something with each substring
:stringLOOP
    REM Stop when the string is empty
    if "!teststring!" EQU "" goto END

    for /f "delims=;" %%a in ("!teststring!") do set substring=%%a

        REM Do something with the substring - 
        REM we just echo it for the purposes of demo
        echo !substring!

REM Now strip off the leading substring
:striploop
    set stripchar=!teststring:~0,1!
    set teststring=!teststring:~1!

    if "!teststring!" EQU "" goto stringloop

    if "!stripchar!" NEQ ";" goto striploop

    goto stringloop
)

:END
endlocal
 

还有这样的:

set input=AAA BBB CCC DDD EEE FFF
set nth=4
for /F "tokens=%nth% delims= " %%a in ("%input%") do set nthstring=%%a
echo %nthstring%
 

其实Powershell里可能有更多的内置函数可以使用:

PS C:\> "AAA BBB CCC DDD EEE FFF".Split()

还有人提出用vbscrip代替bat:

Set objFS = CreateObject("Scripting.FileSystemObject")
Set objArgs = WScript.Arguments
str1 = objArgs(0)
s=Split(str1," ")
For i=LBound(s) To UBound(s)
    WScript.Echo s(i)
    WScript.Echo s(9) ' get the 10th element
Next
usage:
c:\test> cscript /nologo test.vbs "AAA BBB CCC"

 

最后来一个bat中的小难点: 变量延迟(自上而下,逐条(简单语句、复合语句(for、if 语句块只算一条))执行,而非逐行执行)

http://blog.csdn.net/icebergsnowfox/article/details/8047613

 

http://cndos.fam.cx/forum/    

 

 

@echo off
echo 当前盘符:%~d0
echo 当前盘符和路径:%~dp0
echo 当前批处理全路径:%~f0
echo 当前盘符和路径的短文件名格式:%~sdp0
echo 当前CMD默认目录:%cd%
echo 目录中有空格也可以加入""避免找不到路径
echo 当前盘符:"%~d0"
echo 当前盘符和路径:"%~dp0"
echo 当前批处理全路径:"%~f0"
echo 当前盘符和路径的短文件名格式:"%~sdp0"
echo 当前CMD默认目录:"%cd%"
pause

 

https://www.jb51.net/article/72045.htm

Windows bat脚本的for语句基本形态如下:

在cmd窗口中:for %I in (command1) do command2
在批处理文件中:for %%I in (command1) do command2
之所以要区分cmd窗口和批处理文件两种环境,是因为在这两种环境下,命令语句表现出来的行为虽然基本一样,但是在细节上还是稍有不同,最明显的一个差异就是:在cmd窗口中,for之后的形式变量I必须使用单百分号引用,即%I;而在批处理文件中,引用形式变量I必须使用双百分号,即%%I。为了方便起见,若不是特别强调,以下的讲解都以批处理文件环境为例。
我们先来看一下for语句的基本要素都有些什么:

for、in和do是for语句的关键字,它们三个缺一不可;
%%I是for语句中对形式变量的引用,即使变量l在do后的语句中没有参与语句的执行,也是必须出现的;
in之后,do之前的括号不能省略;
command1表示字符串或变量,command2表示字符串、变量或命令语句;
  下面来看一个Windows bat脚本的demo(记为demo1):

@echo off
for %%I in (ABC) do echo %%I
pause 

@echo off for %%I in (A,B,C) do echo %%I pause

 

 

 高级用法:

1)搜索当前目录下有哪些文件?

@echo off
for %%i in (*.*) do echo "%%i"
pause

2)搜索当前目录下所有的文本文件?

@echo off
for %%i in (*.txt) do echo "%%i"
pause

https://blog.csdn.net/ab7434588/article/details/53055890


FOR /D %variable IN (set) DO command [command-parameters]

如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。

FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

检查以 [drive:]path 为根的目录树,指向每个目录中的 FOR 语句。
如果在 /R 后没有指定目录规范,则使用当前目录。如果集仅为一个单点(.)字符,
则枚举该目录树。


for /d用于搜索目录或文件夹(不搜索文件),而且只搜索指定目录,不搜索子目录

1.for /r主要用于搜索指定路径及其所有子目录中符合要求的文件(/r后如果没有指定目录,则使用当前目录)
将E:\gp下的*.txt文件修改后缀名为.doc文件
@echo off 
for /r "E:\gp" %%a in (*.txt)do ren "%%a" "%%~na.doc"

pause

修改之前(如图)

 

 

修改之后我们能看到E:\gp\bb下txt文件也变为了doc文件

 

 

 

2.for /d用于搜索目录或文件夹(不搜索文件),而且只搜索指定目录,不搜索子目录
搜索E:\gp下的所有文件夹
@echo off

for /d %%a in (E:\gp\*) do echo %%a

pause

搜索之前我们能看到E:\gp\dd下是存在一个文件夹ff

 

搜索结果我们只能看到gp目录下的2个文件夹


---------------------

dos常用命令:

修改dos窗口标题:

通过批处理Bat,可修改MSDOS窗口标题、大小、字体及背景颜色等,下面逐一为你介绍。

下面的方法,可在MSDOS窗口中直接使用代码,也可以将代码写入BAT文件中使用。

①改变窗口大小

mode con cols=30 lines=20

②设置cmd窗口的标题

title=窗口标题

比如: title=大众计算机

③改变字体及背景颜色

color [fb]

例如: color 47