⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 第一章 批处理基础.txt

📁 DOS和批处理技术 这些是我长期学习积累下来的总共有47个文件
💻 TXT
📖 第 1 页 / 共 2 页
字号:
assoc .exe    #显示.exe代表的'文件类型',结果显示 .exe=exefile
ftype           #显示所有'文件类型'关联
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %* 
assoc .txt=Word.Document.8
设置.txt为word类型的文档,可以看到.txt文件的图标都变了
assoc .txt=txtfile
恢复.txt的正确关联

ftype exefile="%1" %*
恢复 exefile 的正确关联
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
12、pushd 和 popd
切换当前目录
@echo off
c: & cd\ & md mp3    #在 C:\ 建立 mp3 文件夹
md d:\mp4             #在 D:\ 建立 mp4 文件夹
cd /d d:\mp4          #更改当前目录为 d:\mp4
pushd c:\mp3          #保存当前目录,并切换当前目录为 c:\mp3
popd                    #恢复当前目录为刚才保存的 d:\mp4
一般用处不大,在当前目录名不确定时,会有点帮助。(dos编程中很有用)

13、CALL
CALL命令可以在批处理执行过程中调用另一个批处理,当另一个批处理执行完后,再继续执行原来的批处理
CALL [drive:][path]filename [batch-parameters]
调用的其它批处理程序。filename 参数必须具有 .bat 或 .cmd 扩展名。
CALL :label arguments
调用本文件内命令段,相当于子程序。被调用的命令段以标签:label开头
以命令goto :eof结尾。
另外,批脚本文本参数参照(%0、%1、等等)已如下改变:
    批脚本里的 %* 指出所有的参数(如 %1 %2 %3 %4 %5 ...)
    批参数(%n)的替代已被增强。您可以使用以下语法:(看不明白的直接运行后面的例子)
      %~1       - 删除引号("),扩充 %1
      %~f1        - 将 %1 扩充到一个完全合格的路径名
      %~d1        - 仅将 %1 扩充到一个驱动器号
      %~p1        - 仅将 %1 扩充到一个路径
      %~n1        - 仅将 %1 扩充到一个文件名
      %~x1        - 仅将 %1 扩充到一个文件扩展名
      %~s1        - 扩充的路径指含有短名
      %~a1        - 将 %1 扩充到文件属性
      %~t1        - 将 %1 扩充到文件的日期/时间
      %~z1        - 将 %1 扩充到文件的大小
      %~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
                      扩充到找到的第一个完全合格的名称。如果环境
                      变量名未被定义,或者没有找到文件,此组合键会
                      扩充到空字符串
可以组合修定符来取得多重结果:
       %~dp1    - 只将 %1 扩展到驱动器号和路径
       %~nx1    - 只将 %1 扩展到文件名和扩展名
       %~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
                      并扩展到找到的第一个文件的驱动器号和路径。
       %~ftza1     - 将 %1 扩展到类似 DIR 的输出行。
在上面的例子中,%1 和 PATH 可以被其他有效数值替换。
%~ 语法被一个有效参数号码终止。%~ 修定符不能跟 %*使用
注意:参数扩充时不理会参数所代表的文件是否真实存在,均以当前目录进行扩展
要理解上面的知识,下面的例子很关键。
例:
@echo off
Echo 产生一个临时文件 > tmp.txt
Rem 下行先保存当前目录,再将c:\windows设为当前目录
pushd c:\windows
Call :sub tmp.txt
Rem 下行恢复前次的当前目录
Popd
Call :sub tmp.txt
pause
Del tmp.txt
:sub
Echo 删除引号: %~1
Echo 扩充到路径: %~f1
Echo 扩充到一个驱动器号: %~d1
Echo 扩充到一个路径: %~p1 
Echo 扩充到一个文件名: %~n1
Echo 扩充到一个文件扩展名: %~x1
Echo 扩充的路径指含有短名: %~s1 
Echo 扩充到文件属性: %~a1 
Echo 扩充到文件的日期/时间: %~t1 
Echo 扩充到文件的大小: %~z1 
Echo 扩展到驱动器号和路径:%~dp1
Echo 扩展到文件名和扩展名:%~nx1
Echo 扩展到类似 DIR 的输出行:%~ftza1
Echo.
Goto :eof
14、shift
更改批处理文件中可替换参数的位置。
SHIFT [/n]
如果命令扩展名被启用,SHIFT 命令支持/n 命令行开关;该命令行开关告诉
命令从第 n 个参数开始移位;n 介于零和八之间。例如:
SHIFT /2
会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。

15、IF
IF 条件判断语句,语法格式如下:
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
下面逐一介绍,更详细的分析请看后面章节。

(1) IF [NOT] ERRORLEVEL number command
IF ERRORLEVEL这个句子必须放在某一个命令的后面,执行命令后由IF ERRORLEVEL 来判断命令的返回值。
Number的数字取值范围0~255,判断时值的排列顺序应该由大到小。返回的值大于等于指定的值时,条件成立
例:
@echo off
dir c:
rem退出代码为>=1就跳至标题1处执行,>=0就跳至标题0处执行
IF ERRORLEVEL 1 goto 1
IF ERRORLEVEL 0 goto 0
Rem 上面的两行不可交换位置,否则失败了也显示成功。
:0
echo 命令执行成功!
Rem 程序执行完毕跳至标题exit处退出
goto exit
:1
echo 命令执行失败!
Rem 程序执行完毕跳至标题exit处退出
goto exit
:exit
pause
运行显示:命令执行成功!
(2) IF [NOT] string1==string2 command
string1和string2都为字符的数据,英文内字符的大小写将看作不同,这个条件中的等于号必须是两个(绝对相等的意思)
条件相等后即执行后面的command
检测当前变量的值做出判断,为了防止字符串中含有空格,可用以下格式
if [NOT] {string1}=={string2} command
if [NOT] [string1]==[string2] command
if [NOT] “string1”==“string2” command
这种写法实际上将括号或引号当成字符串的一部分了,只要等号左右两边一致就行了,比如下面的写法就不行:
if {string1}==[string2] command

(3) IF [NOT] EXIST filename command
EXIST filename为文件或目录存在的意思
echo off
IF EXIST autoexec.bat echo 文件存在!
IF not EXIST autoexec.bat echo 文件不存在!
这个批处理大家可以放在C盘和D盘分别执行,看看效果

16、setlocal 与 变量延迟
本条内容引用[英雄出品]的批处理教程:
要想进阶,变量延迟是必过的一关!所以这一部分希望你能认真看。
为了更好的说明问题,我们先引入一个例子。
例1:
@echo off
set a=4
set a=5 & echo %a%
pause
结果:4
解说:为什么是4而不是5呢?在echo之前明明已经把变量a的值改成5了?
让我们先了解一下批处理运行命令的机制:
批处理读取命令时是按行读取的(另外例如for命令等,其后用一对圆括号闭合的所有语句也当作一行),在
处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。我们现在分析一下例1,批处理
在运行到这句“set a=5 & echo %a%”之前,先把这一句整句读取并做了预处理——对变量a赋了值,那么%a%当然就是4了!(没有为什么,批处理就是这样做的。)
而为了能够感知环境变量的动态变化,批处理设计了变量延迟。简单来说,在读取了一条完整的语句之后,不
立即对该行的变量赋值,而会在某个单条语句执行之前再进行赋值,也就是说“延迟”了对变量的赋值。
那么如何开启变量延迟呢?变量延迟又需要注意什么呢?举个例子说明一下:
例2:
@echo off
setlocal enabledelayedexpansion
set a=4
set a=5 & echo !a!
pause 
结果:5
解说:启动了变量延迟,得到了正确答案。变量延迟的启动语句是“setlocal enabledelayedexpansion”,并且变量要用一对叹号“!!”括起来(注意要用英文的叹号),否则就没有变量延迟的效果。
分析一下例2,首先“setlocal enabledelayedexpansion”开启变量延迟,然后“set a=4”先给变量a赋值为
4,“set a=5 & echo !a!”这句是给变量a赋值为5并输出(由于启动了变量延迟,所以批处理能够感知到动态变化,即不是先给该行变量赋值,而是在运行过程中给变量赋值,因此此时a的值就是5了)。
再举一个例子巩固一下。
例3:
@echo off
setlocal enabledelayedexpansion
for /l %%i in (1,1,5) do (
set a=%%i
echo !a!
)
pause
结果:
1
2
3
4
5
解说:本例开启了变量延迟并用“!!”将变量扩起来,因此得到我们预期的结果。如果不用变量延迟会出现什
么结果呢?结果是这样的:
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
即没有感知到for语句中的动态变化。





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -