batch(批处理)
百度百科:https://baike.baidu.com/item/%E6%89%B9%E5%A4%84%E7%90%86/1448600?fr=aladdin
批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中。批处理文件的扩展名为bat 。目前比较常见的批处理包含两类:DOS批处理和PS批处理。PS批处理是基于强大的图片编辑软件Photoshop的,用来批量处理图片的脚本;而DOS批处理则是基于DOS命令的,用来自动地批量地执行DOS命令以实现特定操作的脚本。更复杂的情况,需要使用if、for、goto等命令控制程式的运行过程,如同C、Basic等高级语言一样。如果需要实现更复杂的应用,利用外部程式是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件。批处理程序虽然是在命令行环境中运行,但不仅仅能使用命令行软件,任何当前系统下可运行的程序都可以放在批处理文件中运行。
有些人认为批处理语言的含义要比上面的描述更广泛,还包括许多软件自带的批处理语言,如 Microsoft Office、Visual Studio、Adobe Photoshop 所内置的批处理语言的功能,用户可通过它们让相应的软件执行自动化操作(例如调整某个资料夹所有 PSD 图档的解析度)。 而这类批处理语言也大多提供把一系列操作录制为批处理文件的功能,这样用户不必写程式就能得到批处理程序。[1]
这里指的是window系统上的批处理
相关链接
- 批处理之家在线第三方库
http://bcn.bathome.net/s/tool/index.html - Batch入门教程丨第一章:部署与Hello World!(上) - i春秋 - 博客园
https://www.cnblogs.com/ichunqiu/p/10396117.html
@echo off
:love
set /p o=要运行吗? (YES NO):
if /i "%o%"=="yes" goto yes
if /i "%o%"=="no" goto no
goto love
:yes
echo 你选择了运行!
pause
exit
:no
echo 你选择了不运行!
pause
exit
转义符
用在特殊符号之前,取消特殊字符的作用.
比如:
echo 非常^&批处理
连字符&在此命令中只当作一个字符显示到屏幕中
如果不加^ 那么"批处理"将被当作命令执行
| (管道)传递符
当然是传递作用,将前面一条命令的执行结果传递给后面一条命令继续执行.
比如:
echo 0123456 | find "123"
将0123456 传递给find 查找 123
|| 连接符
当前面的命令没有成功执行 则执行后面的命令 可以作判断选择用.
比如:
echo 0123456 | find "789" || echo 字符中没有789
此命令的意思是在0123456中查找字符789,如果没有找到则继续执行后面的命令,
即在屏幕中显示"字符中没有789",如果找到了,也就是如果前面是0123456789的话则停止继续执行||后面的命令,而是在屏幕中直接显示"0123456789".
&& 连接符
当前面的命令成功执行 再执行后面的命令
比如:
echo 0123456 | find "123" && echo 字符中含有123
这个命令跟||刚好相反.
& 连接符
无论前面的命令是否成功执行 都执行后面的
比如:
echo 0123456 | find "789" & echo 字符中含有123
虽然没有成功到789 但还是会执行echo 命令
> 定向符
将输出的内容重定向到指定(文本中)
比如
echo 123456789>1.txt
输出字符串到1.txt中
如果是 >nul 则是输出到空设备中 起屏蔽屏幕输出的作用
比如
pause>nul 将命令的提示屏蔽掉
>> 定向符(追加)
将输出内容写入指定(文本中)
注意,">"将覆盖文本中原有内容
">>" 则是在文本的最后添加内容,
比如
echo 123>1.txt
echo 456>>1.txt
文本中有两行 分别是 123和456
如果echo 456>1.txt
那么 原有文本中的123将会替换成456
< 输入定向符
从指定的(文本)输入内容
一般用于set /p
比如
echo 456>1.txt
set /p wind=<1.txt
这样 1.txt第一行内容就被赋值给wind了
本来set /p 这个命令是用来设置给用户输入字符的,但是=后用<1.txt,
意思是从1.txt文件中读取信息给SET /P ,而不需要用户输入.
http://wuxiong8665.blog.163.com/blog/static/93512200911623811370/
--------------------------------------------------------------------------------------------------------------------------------------------------------
较详细的一篇
这是一篇针对批处理中常用符号的详细解释,每个符号都有解释及相应的举例,希望通过比较系统的讲述,能让新手尽快入门。
在这篇帖子中,我对常用符号的讲解做如下限定:
1、收集批处理中经常用到的符号;
2、每个常用符号,只讲述最常用的功能;深入的用法留待将来介绍;
这样限定的原因,一是让新手系统地接触最常用符号的常用功能,不至于一开始就陷入技术细节中难以自拔;二是有些符号的用法非常罕见,没有特定的需求可以忽略掉,比如句柄复制符号;三是有些高深的内容本人也没有完全消化,只解说一鳞半爪难免会误人子弟,比如 set /a 中的^、!等符号;
如有遗漏或谬误,请大家及时跟帖,帮忙修正。
————————————————————————————————————————————
1、@
一般在它之后紧跟一条命令或一条语句,则此命令或语句本身在执行的时候不会显示在屏幕上。请把下面的代码保存为test.cmd文件,然后运行,比较一下两条echo语句在屏幕上的输出差异:
- echo a
- @pause
- @echo b
- @pause
复制代码
执行结果如下:
C:\Documents and Settings\JM\桌面>echo a
a
请按任意键继续...
b
请按任意键继续...
2、%、%%
百分号用在不同的场合,有不同的含义:
① 当百分号成对出现,并且其间包含非特殊字符时,一般做变量引用处理,比如:%var%、%str%。把以下代码保存为批处理文件,运行后观察屏幕显示结果:
- @echo off
- set str=abc
- echo 变量 str 的值是: %str%
- pause
复制代码
在屏幕上将显示这样的结果:
变量 str 的值是: abc
按任意键继续...
另外,百分号作为变量引用还有一种特殊形式,那就是对形式参数的引用,此时,单个百分号后面紧跟0~9这10个数字,如%0、%1,请看演示代码:
- @echo off
- if defined str goto next
- set str=
- set /p str=请把文件拉到本窗口后回车:
- call "%~0" %str%
- pause
- exit
- :next
- cls
- echo 本批处理文件完整路径为:"%~0"
- echo 拖到本窗口的文件完整路径为:"%~1"
- goto :eof
复制代码
② 出现在 set /a 语句中时,表示两数相除取余数,也就是所谓的模运算,它在命令行窗口和批处理文件中的写法略有差异:在命令行窗口中,只需要单个的%,在批处理文件中,需要连续两个百分号,写成%%。
例如:在命令行窗口中,运行 set /a num=4%2 ,则结果将显示0,因为4除以2的余数为0;如果保存为批处理文件,则此语句将略有改变:
- @echo off
- set /a num=4%%2
- echo 4除以2的余数为 %num%
- pause
复制代码
③ 转义符号:如果要显示%本身时,需要在前面用%来转义。例如:
- @echo off
- echo 一个百分号:%%
- echo 两个百分号:%%%%
- echo 三个百分号:%%%%%%
- pause
复制代码
3、:、::
① 以:打头的单个的:表示该行是一个标签,它之后的内容是一个标签段,如:test,则表示:test之下的内容是标签段,而test是这个标签段的名,可以用 goto test 、goto :test 跳转到该标签段或用 call :test 调用该子过程;而连续两个冒号打头表示该行内容为注释内容,实际上,:: 是个无效的标签名,:加上空格同样可以起到注释的作用,此时,::的功能和注释命令rem相同;但是,rem 注释语句中的某些命令符号如重定向符号和管道符号还是会执行,而如果用::来注释的时候,与::同处一行的所有命令或符号直接被命令解释器忽略掉,无形中提高了注释的兼容性和整个程序的执行效率,并且在众多的命令语句中更显得醒目,所以,注释语句推荐使用::的格式。
② 在 set 语句中:和~同时使用时,: 起到截取字符串的功能。假设 set str=abcde,那么,set var=%str:~0,1% 表示截取字符串abcde的第一个字符;和=同时使用时,起到替换字符串的功能。假设:set str=abc:de,那么,set var=%str:a=1% 则表示把字符串abc:de中的a替换为1,set var=%str::=2% 则表示把字符串abc:de中的:替换为2;
4、~
① 用在 set 语句中,和:同时使用时,起到截取字符串的功能,请参考上一条的解释;
② 用在 set /a 语句中时,它是一元运算符号,表示将操作数字按位取反,例如,set /a num=~1的执行结果是-2,set /a num=~0的结果是-1
③ 用在for语句中,表示增强for的功能,能够提取到更多的信息。例如:在批处理文件的for语句中:%%~i表示去掉第一对外侧引号,%%~zi表示获取文件的大小(以字节为单位),%%~ni表示获取文件名,%%~xi表示获取扩展名(带点号)……它们可以组合使用,如%%~nxi表示获取文件名和后缀名。
5、>、>>
一般而言,>表示用新内容覆盖原文件内容,>>表示向原文件追加内容,此时,它们以重定向符号的身份出现;如果用在 set /a 语句中,则>表示分组,>>表示逻辑移位;
6、|
一般而言,它以管道符号的身份出现,表示把在它之前的命令或语句的执行结果作为在它之后的命令或语句的处理对象,简而言之,就是把它之前的输出作为它之后的输入,例如:echo abcd|findstr "b",表示把echo abcd的执行结果,作为findstr "b" 的执行对象,也就是在字符串abcd中查找b字符;如果test.txt中有abcd字符串,则该语句与 findstr "b" test.txt 具有同样的效果;
7、^
一般而言,^以转义字符的身份出现。因为在cmd环境中,有些字符具备特殊功能,如>、>>表示重定向,|表示管道,&、&&、||表示语句连接……它们都有特定的功能,如果需要把它们作为字符输出的话,echo >、echo | ……之类的写法就会出错——cmd解释器会把它们作为具有特殊功能的字符对待,而不会作为普通字符处理,这个时候,就需要对这些特殊字符做转义处理:在每个特殊字符前加上转义字符^,因此,要输出这些特殊字符,就需要用 echo ^>、echo ^|、echo ^|^|、echo ^^……之类的格式来处理;
8、&
一般而言,&表示两条命令或语句同时执行的意思。如 echo a&echo b,将在屏幕上同时显示a和b字符。当几条语句含义近似或作用相同且没有先后的顺序之别时,启用&符号连接这些语句将会增加程序的可读性;
9、&&、||
这是一对含义截然相反的命令符,&&表示如果它之前的语句成功执行,将执行它之后的语句,而||则表示如果它之前的语句执行失败,将执行它之后的语句;在某些场合,它们能替代 if……else…… 语句;例如:
- @echo off
- md test&&echo 成功创建文件夹test||echo 创建文件夹test失败
- pause
复制代码
效果等同于如下代码:
- @echo off
- md test
- if "%errorlevel%"=="0" (echo 成功创建文件夹test) else echo 创建文件夹test失败
- pause
复制代码
10、()
小括号对经常出现在for语句和if语句中,还有一些特定场合;在for和if语句中属于语句格式的要求,例如:
① for %%i in (语句1) do (语句2):在这条语句中,语句1必须用括号对包围,而语句2的括号对则可视情况予以抛弃或保留:如果语句2是单条语句或用&、&&、||等连接符号连接的多条语句,括号对可以抛弃,如果语句2是有逻辑先后关系的多条语句集合,则必须保留括号对,并且,多条语句必须断行书写;例如:
- @echo off
- for %%i in (a b c) do echo %%i&echo --------
- pause
复制代码
也可以改写为:
- @echo off
- for %%i in (a b c) do (
- echo %%i
- &echo --------
- )
- pause
复制代码
② if 条件 (语句1) else (语句2):如果没有else部分,则语句1的括号对可有可无;如果有else部分,则语句1中的括号对必须保留,此时,语句2中的括号对保留与否,和上一点类似。例如:
- @echo off
- if exist test.txt echo 当前目录下有test.txt
- pause
复制代码
- @echo off
- if exist test.txt (echo 当前目录下有test.txt) else echo 当前目录下没有test.txt
- pause
复制代码
- @echo off
- if exist test.txt (echo 当前目录下有test.txt) else (
- echo 当前目录下没有test.txt
- pause
- cls
- echo 即将创建test.txt文件
- cd.>test.txt&&echo 成功创建test.txt
- )
- pause
复制代码
③ 特定场合下使用括号对,不但可以使代码逻辑清晰,增强可读性,还可能会减少代码量。比如用echo语句构造多行文本内容的时候:
- @echo off
- (
- echo 第一行
- echo 第二行
- echo 第三行
- )>test.txt
- start test.txt
复制代码
如果不使用括号对的话,则需要使用如下代码:
- @echo off
- echo 第一行>test.txt
- echo 第二行>>test.txt
- echo 第三行>>test.txt
- start test.txt
复制代码
11、+、-、、/
在 set /a 语句中,这些符号的含义分别为:加、减、乘、除。例如:set /a num=1+2-34/5。需要注意的是,这些运算符号遵循数学运算中的优先级顺序:先乘除后加减,有括号的先算括号,并且,直接忽略小数点,因此,刚才那个算式的结果是1而不是0或0.6。
另外,有可能会在代码中看到这样的写法:set /a num+=1、set /a num-=1、set /a num=1 和 set /a num/=1,这些表示累加、累减、累乘、累除,步长都是1,展开后的完整写法为:set /a num=num+1、set /a num=num-1、set /a num=num1 和 set /a num=num/1(set /a 语句中,变量引用可以忽略百分号对或感叹号对,set /a num=%num%+1 与 set /a num=num+1 等同)
12、equ、neq、lss、leq、gtr、geq
这几个命令符是if语句中常用到的数值比较符号,取自英文的关键字母,具体的含义为:
命令符号 含义 英文解释
EQU 等于 equal
NEQ 不等于 not equal
LSS 少于 less than
LEQ 少于或等于 less than or equal
GTR 大于 greater than
GEQ 大于或等于 greater than or equal
http://www.bathome.net/thread-1205-1-1.html
bat的重定向
bat语句中“1>&2”是什么意思?_百度知道
https://zhidao.baidu.com/question/509215245.html
bat重定向符号主要有:
>
>>
<
>&
<&
|
第一节
首先从一个经典问题开始,
1>nul 2>nul
上面的意思是既屏蔽正常的输出又屏蔽错误的输出,那么我们马上就知道了这里的1代表标准输出(stdout
),2代表标准错误输出(`--stderr
)。
1和2其实是句柄stdout和stderr的数字代号,至于什么是句柄,我认为可以理解为某种事物的一种标识,或者说这个句柄指向某个事物。和编程里面的指针和引用概念类似,这些概念来自linux 的shell 编程
目前定义的有3个句柄
0 stdin 标准输入
1 stdout 标准输出
2 stderr 标准错误信息输出
默认的输出目标设备是shell,用con表示(即cmd窗口),默认的输入设备也是shell
常见的设备标识如下所示
con, console, 表示控制台设备(键盘/显示器),即命令行窗口
nul, null,空设备,表示不存在的设备,用于消费输出
prn, printer,(已过时),第一并行通信口/打印机(同LPT1)
LPT1~LPT3,(已过时), 第一到第三并行通信口(往往用于表示打印机,因打印机多接在并口上)
AUX (已过时),第一串行通信口(同COM1)
COM1~COM4 (已过时),第一~第四串行通信口
TTY1-n ,linux上表示终端的设备
并行接口_百度百科
https://baike.baidu.com/item/%E5%B9%B6%E8%A1%8C%E6%8E%A5%E5%8F%A3/2909506?fr=aladdin
串行端口_百度百科
https://baike.baidu.com/item/%E4%B8%B2%E8%A1%8C%E7%AB%AF%E5%8F%A3/7353286?fr=aladdin
关于那些魔术般的名字(NUL, CON, PRN…)_拓扑梅尔 - 漫漫开发路-CSDN博客
https://blog.csdn.net/mmxida/article/details/106891235
重定向符号的默认设备值如下所示
> 1 2
>> 1 2
< 0
测试示例
dir 输出数据
dir 1>con 2>con 同上
dir 1>nul 无输出显示
dir /ccc 输出错误
dir /ccc 1>con 无影响
dir /ccc 2>nul 无错误输出
echo hhhhhh
类似于这样的语句可以说是我们再熟悉不过的了,但这只是种默认的状态,其实里面还有一些内容。这一句完整的应该是这样的:
echo hhhhhh 1>con 2>con
意思是将echo命令的结果中的标准输出和标准错误输出输出到控制台con中,只不过此时标准错误输出是空的。
再看一个例子,如果给dir一个错误的参数,例如dir /mm
,那么写全了就是dir /mm 1>con 2>con
,只不过此时的标准输出是空的。如果你这样写的话dir /mm 1>hero.txt
,那么屏幕上会照常显示错误信息但hero.txt中不会有内容。
再来一个标准输入的例子,“set /p var= ”其实应该是这样的“set /p var= 0<con”,只是因为0<con是默认值可以省略。
我们当然可以从文件中读取输入,如“set /p var=0<file.txt”,0是默认值可以省略。
nul代表的是“空设备”,是一个不存在的设备,将输出流重定向到空设备就相当于屏蔽掉了一样。而如果从空设备中读取输入,自然是读不到东西的,但的确是输入了,这也就是“set /p var=0<nul”中“<nul”相当于回车但不换行的原因。
好了,说到这里,相信大家对重定向输出和输入又有了进一步的了解,关于重定向输出到文件和由文件重定向输入的问题在此也不再复述。我下面要讲的是句柄代码之间的“重定向”。
之前不是提到过还有3~9这7个句柄数字代号吗,这些究竟有什么用?说实话,基本没什么用,因此建议你如果不是迫切想知道这部分内容的话就不要往下看了。
“echo hero 1>hero.txt”这一句是将标准输出重定向到文件hero.txt,相当于将句柄代号1的指向由con变为hero.txt。“echo hero 3>hero.txt 1<&3”,这句的结果是生成了文件hero.txt,其内容为hero,过程是这样的:“3>hero.txt”是将句柄数字代号 3的指向由“空”变为hero.txt;“1<&3”是将句柄数字代号3的指向复制给1的指向,此时1的指向就为hero.txt了,因此标准输出就被重定向到hero.txt中了。
“i<&j”和“i>&j”的效果都是把j的指向复制给i。“echo hero >hero.txt2>&1”这句的意思是,无论是标准输出还是标准错误输出都会被重定向到hero.txt中,具体过程:1的指向由con转为hero.txt,“2>&1”是把1的指向复制给2,此时2的指向也变为了hero.txt,因此1和2都会被重定向到hero.txt中。注意:1是符号“>”的默认句柄数字代号。
再看“echo hero3>hero.txt”,这个为什么就不能将结果重定向到文件中呢?记住,我们要重定向的只有标准输入、标准输出和标准错误输出,因此真正“干活”
的就只有0、1和2,因为它们分别指代了前面的三者,而3没有指代任何句柄只能作为间接量使用。 “more 3<hero.txt 0>&3”这句是显示文件hero.txt,具体过程:“3<hero.txt”把3的指向变为hero.txt,“0>&3”把3的指向复制给0,即0指向了hero.txt(只不过这次是从hero.txt中读取数据)。强调一下,真正能读取数据的是0而不是3,3只是作为中间量而已。刚才这句我们当然可以这么写:“more 0<hero.txt”或直接“more <hero.txt”。
再来一个例子“echo hero 5>hero.txt 4>&53<&4 1<&3”,结果输出到了hero.txt中。具体过程:5的指向变成hero.txt,“4>&5”把5的指向复制给4,“3>&4”把4的指向复制给3,“1>&3”把3的指向复制给1,最终1的指向就是hero.txt,则1所指代的标准输出就被重定向到了hero.txt。
第三节
注意:这一节的内容都是围绕着下面这个例子进行叙述的。
复制内容到剪贴板代码:@echo off
echo 英雄是好男人!!!
echo. 1>nul 3>nul
echo 英雄是
echo 英雄是
echo 这是怎么回事,难道就不能 1>con 4>con
pause这究竟是怎么回事?为什么结果会如此出乎意料?
这里涉及到一个所谓“备份”的问题,就是在修改某个句柄代号的指向之前,系统会把该句柄代号原来的指向备份到截止到目前第一个指向为空的句柄代号中。目的是当这一行的程序结束之后,系统可以通过备份找回原来的指向。 在继续阅读之前建议你准备好纸笔,以便能记录下各个代号指向的变化,这样不至于混乱。 我们现在把焦点集中到这句“echo. 1>nul 3>nul”上来。这句究竟是如何工作的呢?
第一步:在运行“1>nul”之前,1的指向是默认值con,此时代号3~9的指向都是空(初始值),因此系统会把1的指向备份到3(因为3是第一个为空的代号),3就指向了con。就是说系统把1原来的指向复制给了3,目的是语句结束后能找回原来的指向,这就相当于备份。
第二步:现在3的指向是con。然而由于要运行“3>nul”,因此还要备份3的指向。此时4是空的,系统就把3的指向con复制给了4,即4现在指向con。就是说3以4为备份。
第三步:由于“3>nul”使得3指向了nul。第四步:这行语句结束时,1要找回原来的指向,从以上叙述我们知道,3是1的备份,因此1要通过3来恢复“原来”的指向,但此时3的指向已经变为了nul,故1就指向nul。第五步:而3要恢复原来的指向就要找4,4指向con,故3恢复为con;4原始指向是空的,其备份在5中,故4的指向恢复到空。
至此我们理顺一下,现在1指向nul,2指向默认值con,3指向con,4之后都是空指向。那么在运行后两句echo语句时由于1指向nul,即标准输出被重定向到空设备,故显示被屏蔽。
再来看看这句 “echo 这是怎么回事,难道就不能骂骂英雄吗??? 1>con 4>con” 这句是怎么工作的呢?第一步:1当前指向是nul,由于要运行“1>con”,因此要进行备份。但此时3指向的是con非空,故系统将1的指向备份到4,即4指向nul。第二步:又由于要运行“4>con”,故4现在的指向nul就又被备份到5中,5以后的事姑且省略。
第三步:运行完“4>con”之后4就指向con。
第四步:该行程序结束后,1要通过4来恢复指向。4指向con,故1指向con从而恢复了默认状态。而4找5,5指向nul,故4指向nul。 我们再数一数现在的情况,0指向con,1指向con,2指向con,3没动还是指向con,4指向nul,5以后都为空指向。会不会有点乱?那就再好好的看几遍吧,我也实在没有什么好办法了。第四节 我们已经知道“echo hero”相当于“echo hero 1>con 2>con”,con代表了控制台,可以把con看做是特殊的文件,这就是我们无法建立名为con文件的原因。再对“>”和“>>”的重定向机制做个分析。当要重定向到的文件有隐藏或系统属性时,“>>”可以正常运行,而“>”就无法操作了。据此我推测,对于“>”的重定向输出,如果文件不存在当然是建立文件,而如果文件存在就先将文件删除,然后再新建文件,
也就是说并非是覆盖文件的内容而是先删除文件再建立新文件。 通过第三节的讲解你应该明白为什么类似这样的语句“echo hero >nul >con >hero.txt >con”会以最后一个为准了吧。
最后需要注意一点的是--重定向输出无法输出到只读文件。
Batch入门教程
Batch入门教程丨第一章:部署与Hello World!(上) - i春秋学院 - 博客园
https://www.cnblogs.com/ichunqiu/p/10396117.html
在本教程中,您将了解并学习与Windows Batch有关的知识和编程方法,用以解决在日常生活中所遇到的简单问题,或者利用Windows Batch建立一个最初级的编程思维方式。
具体来讲,您可能不仅在这里学到如何编写和运行Windows Batch程序,还有可能学习到脚本语言的入门方式,从而能够更加顺利地投入到以后的开发和探究中。
教程简介
本教程将会根据内容的难易程度,逐条推进,且大部分内容都是面向新手的。因此,也许您可能会发现某些语言叙述过于冗杂不必要,但是请谅解,因为这也许是因为笔者讲话过于啰嗦或者是为了照顾新手。如果您仍然觉得晦涩难懂,欢迎给笔者留言,笔者会尽最大可能提供帮助。
初识
你好,批处理。
批处理是什么?
批处理(Batch)通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的解释器(通常是COMMAND.COM
或者CMD.EXE
)解释运行。类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,最简单的例子就是逐行书写在命令行中会用到的各种命令,也可以在批处理文件后面加上更多种类的参数。
这是摘自Wikipedia的一段对批处理的描述。接下来,笔者介绍一下批处理。
Batch,全称Windows BatchFile,中文名称为“批处理”,繁体中文译为“批次檔”。它是Microsoft Windows自带的一种脚本语言,且相对比较简陋,它的解释器是Command Prompt(即命令提示符)。
批处理的历史可以追溯到DOS时期,直到目前为止还有许许多多的CMD指令都是沿用的DOS指令,没有改变。较为经典的有copy、move、dir、del等基本文件操作。
我们了解这么多并没有太多用处,仅仅是为了能够知道自己到底在写些什么。
批处理的运行
上文中提到,批处理的解释器是命令提示符(cmd.exe),那么批处理的运行就很好阐述了。我们将代码书写在可读的纯文本文件中(但是扩展名为.bat或者.cmd),执行后直接提交给cmd.exe进行处理,最终执行结果。
批处理的指令是逐行执行的,这意味着您执行指令的先后顺序将会影响执行结果。
客户端输入,指的是用户在打开您的程序时,总会有一部分由客户端提交的工作(在此我们把批处理比作是用作处理的后端),例如,您的程序可能使用set /p允许用户输入一些自定义的数据,这是一种输入。此外,打开程序本身也是一种输入,我们在这里将它称为执行输入。因此,只要我们运行了这个程序,那么我们必定给予了一个输入。
这两种输入在本质上没有任何区别,都是由客户端用户授权后执行的操作。
程序代码,指批处理本身的代码。
cmd.exe**,**指的是位于%systemdrive%\Windows\System32\ 的cmd.exe,它就是命令提示符的本体。
那么,客户端输入一经提交,就会按照程序代码原有的约定去处理这些输入。例如,执行输入的处理方式是一定的,即从代码第一行执行,这就是它的处理方式。而对于其它的,例如这时您正在运行一个计算器的程序,那么您输入的数字则会按照代码的约定去进行计算,最后反馈结果。而按照代码的约定则是程序代码发挥的作用,计算则是由cmd.exe完成的。
这些您并不需要深入理解,仅仅了解一下即可。\
批处理的开发环境
众所周知,一般的脚本语言都不需要任何的特殊开发环境。有些,例如 Python,它可能需要您安装解释器,但是并不需要您安装IDE之类的环境来让开发过程更加简便,甚至无法缺少IDE。
批处理使用系统自带的notepad.exe就可以开发,但是实际上却很吃亏,因为它没有高亮,也没有华丽的页面,仅仅是一个编辑纯文本的工具而已。
随后就出现了Notepad++,它的页面很不赖,所以建议一般的新手就使用它来进行开发。
当然,如果您对较为高阶的编辑器感兴趣(这些编辑器往往会有更多的开发者参与开发,且有专门的社区等),您不妨尝试一下Microsoft开发的Visual Studio Code。它比Visual Studio更加轻量(比Notepad++更重量),且可以通过自己的努力或者其它的方式在上面开发任何语言,包括Batch 。
BAT脚本编写教程(比较易懂和全面)
标签(空格分隔): bat 批处理
这篇文章主要介绍了BAT脚本编写教程,比较易懂和全面。适合有一定编程基础的人
作者不详。敬意!
echo
、@
、call
、pause
、rem
(小技巧:用::
代替rem
)是批处理文件最常用的几个命令,我们就从他们开始学起。
- echo 表示显示此命令后的字符
C:\Users\Administrator>echo hello world
结果:
hello world
- echo off 表示在此语句后所有运行的命令都不显示命令行本身
echo off
echo hello world
echo good boy
结果:
C:\Users\Administrator>echo off
hello world
good boy
- @与echo off相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。
echo abc
@echo hello world
echo good boy
结果:
C:\Users\Administrator>echo abc
abc
hello world
C:\Users\Administrator>echo good boy
good boy
- call 调用另一个批处理文件(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)。
call helloworld.bat
echo 'call over'
结果:
C:\Users\Administrator>call helloworld.bat
helloworld
C:\Users\Administrator>echo 'call over'
'call over'
- pause 运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue...的提示,等待用户按任意键后继续
@echo off
echo abc
pause
echo def
pause
echo ghi
结果:
abc
请按任意键继续. . .
def
请按任意键继续. . .
ghi
- rem 表示此命令后的字符为解释行(注释),不执行,只是给自己今后参考用的(相当于程序中的注释)。
rem abc
rem def
:: fgh
结果:
(因为是注释,所以为空)
批处理文件的参数
批处理文件还可以像C语言的函数一样使用参数(相当于DOS命令的命令行参数),这需要用到一个参数表示符%
。
%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0
到%9
,%0
表示批处理命令本身,其它参数字符串用%1
到%9
顺序表示。
例子
@echo off
type %1
type %2
结果:
C:\Users\Administrator>test test.BAT test.BAT
@echo off
type %1
type %2@echo off
type %1
type %2
特殊命令
if
goto
choice
for
是批处理文件中比较高级的命令,如果这几个你用得很熟练,你就是批处理文件的专家啦。
if语句
if 是条件语句,用来判断是否符合规定的条件,从而决定执行不同的命令。 有三种格式:
-
if [not] "参数" == "字符串" 待执行的命令
参数如果等于(not表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一句。例:if "%1"=="a" echo a:
-
if [not] exist [路径]文件名 待执行的命令
如果有指定的文件,则条件成立,运行命令,否则运行下一句。如: if exist c:\config.sys type c:\config.sys
-
if errorlevel <数字> 待执行的命令
很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),通过if errorlevel
命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列)。如果返回值等于指定的数字,则条件成立,运行命令,否则运行下一句。如if errorlevel 2 goto x2
goto语句
goto 批处理文件运行到这里将跳到goto所指定的标号(标号即label,标号用:后跟标准字符串来定义)处,goto语句一般与if配合使用,根据不同的条件来执行不同的命令组。
如:goto end:end echo this is the end
标号用“:字符串”来定义,标号所在行不被执行。
choice语句
choice 使用此命令可以让用户输入一个字符(用于选择),从而根据用户的选择返回不同的errorlevel
,然后于if errorlevel
配合,根据用户的选择运行不同的命令。
注意:choice命令为DOS或者Windows系统提供的外部命令,不同版本的choice命令语法会稍有不同,请用choice /?查看用法。
注意:ERRORLEVEL
环境变量被设置为从选择集选择的键索引。列出的第一个选择返回1,第二个选择返回2,等等。如果用户按的键不是有效的选择,该工具会发出警告响声。如果该工具检测到错误状态,它会返回255的ERRORLEVEL值。如果用户按Ctrl+Break
或Ctrl+C
键,该工具会返回0的ERRORLEVEL值。在一个批程序中使用ERRORLEVEL参数时,将参数降序排列。
示例:CHOICE /? CHOICE /C YNC /M "确认请按 Y,否请按 N,或者取消请按 C。"CHOICE /T 10 /C ync /CS /D yCHOICE /C ab /M "选项 1 请选择 a,选项 2 请选择 b。"CHOICE /C ab /N /M "选项 1 请选择 a,选项 2 请选择 b。"如果我运行命令:CHOICE /C YNC /M "确认请按 Y,否请按 N,或者取消请按 C。"屏幕上会显示:确认请按 Y,否请按 N,或者取消请按 C。 [Y,N,C]?
例:test.bat的内容如下(注意,用if errorlevel判断返回值时,要按返回值从高到低排列): @echo off choice /C dme /M "defrag,mem,end"if errorlevel 3 goto endif errorlevel 2 goto mem if errotlevel 1 goto defrag:defrag c:\dos\defrag goto end:mem mem goto end:end echo good bye
此批处理运行后,将显示“defrag,mem,end[D,M,E]?” ,用户可选择d m e ,然后if语句根据用户的选择作出判断,d表示执行标号为defrag的程序段,m表示执行标号为mem的程序段,e表示执行标号为end的程序段,每个程序段最后都以goto end将程序跳到end标号处,然后程序将显示good bye,批处理运行结束。
for循环语句
对一组文件中的每一个文件执行某个特定命令。
FOR %%variable IN (set) DO command [command-parameters]
%%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters
为特定命令指定参数或命令行开关。
例如一个批处理文件中有一行:
for %%c in (.bat .txt) do type %%c
则该命令行会显示当前目录下所有以bat和txt为扩展名的文件的内容。
批处理示例
IF-EXIST
- 首先用记事本在C:\建立一个test1.bat批处理文件,文件内容如下:
@echo off IF EXIST \AUTOEXEC.BAT TYPE \AUTOEXEC.BAT IF NOT EXIST \AUTOEXEC.BAT ECHO \AUTOEXEC.BAT does not exist然后运行它:C:\>TEST1.BAT
如果C:\存在AUTOEXEC.BAT文件,那么它的内容就会被显示出来,如果不存在,批处理就会提示你该文件不存在。
- 接着再建立一个test2.bat文件,内容如下:
@ECHO OFF IF EXIST \%1 TYPE \%1 IF NOT EXIST \%1 ECHO \%1 does not exist执行: C:\>TEST2 AUTOEXEC.BAT
该命令运行结果同上。
说明:
(1)IF EXIST 是用来测试文件是否存在的,格式为
IF EXIST [路径+文件名] 命令
(2) test2.bat文件中的%1是参数,DOS允许传递9个批参数信息给批处理文件,分别为%1~%9(%0表示test2命令本身) ,这有点象编程中的实参和形参的关系,%1是形参,AUTOEXEC.BAT是实参。
3) 更进一步的,建立一个名为TEST3.BAT的文件,内容如下:
@echo offIF "%1" == "A" ECHO XIAO IF "%2" == "B" ECHO TIAN IF "%3" == "C" ECHO XIN如果运行:C:\>TEST3 A B C
屏幕上会显示:
XIAOTIANXIN
如果运行:
C:\>TEST3 A B
屏幕上会显示.
XIAOTIAN
在这个命令执行过程中,DOS会将一个空字符串指定给参数%3。
2、IF-ERRORLEVEL
建立TEST4.BAT,内容如下:
@ECHO OFF XCOPY C:\AUTOEXEC.BAT D:IF ERRORLEVEL 1 ECHO 文件拷贝失败 IF ERRORLEVEL 0 ECHO 成功拷贝文件然后执行文件:C:\>TEST4
如果文件拷贝成功,屏幕就会显示“成功拷贝文件”,否则就会显示“文件拷贝失败”。
IF ERRORLEVEL 是用来测试它的上一个DOS命令的返回值的,注意只是上一个命令的返回值,而且返回值必须依照从大到小次序顺序判断。
因此下面的批处理文件是错误的:
@ECHO OFF XCOPY C:\AUTOEXEC.BAT D:\ IF ERRORLEVEL 0 ECHO 成功拷贝文件 IF ERRORLEVEL 1 ECHO 未找到拷贝文件 IF ERRORLEVEL 2 ECHO 用户通过ctrl-c中止拷贝操作 IF ERRORLEVEL 3 ECHO 预置错误阻止文件拷贝操作IF ERRORLEVEL 4 ECHO 拷贝过程中写盘错误
无论拷贝是否成功,后面的:
未找到拷贝文件
用户通过ctrl-c中止拷贝操作
预置错误阻止文件拷贝操作
拷贝过程中写盘错误
都将显示出来。
以下就是几个常用命令的返回值及其代表的意义:
backup
0 备份成功 1 未找到备份文件 2 文件共享冲突阻止备份完成 3 用户用ctrl-c中止备份 4 由于致命的错误使备份操作中止
diskcomp
0 盘比较相同 1 盘比较不同 2 用户通过ctrl-c中止比较操作 3 由于致命的错误使比较操作中止 4 预置错误中止比较
diskcopy
0 盘拷贝操作成功 1 非致命盘读/写错 2 用户通过ctrl-c结束拷贝操作 3 因致命的处理错误使盘拷贝中止 4 预置错误阻止拷贝操作
format
0 格式化成功 3 用户通过ctrl-c中止格式化处理 4 因致命的处理错误使格式化中止 5 在提示“proceed with format(y/n)?”下用户键入n结束
xcopy
0 成功拷贝文件 1 未找到拷贝文件 2 用户通过ctrl-c中止拷贝操作 4 预置错误阻止文件拷贝操作 5 拷贝过程中写盘错误
3、IF STRING1 == STRING2
建立TEST5.BAT,文件内容如下:
@echo off IF "%1" == "A" formAT A:执行: C:\>TEST5 A
屏幕上就出现是否将A:盘格式化的内容。
注意:为了防止参数为空的情况,一般会将字符串用双引号(或者其它符号,注意不能使用保留符号)括起来。
如:if [%1]==[A] 或者 if %1*==A*
5、GOTO
建立TEST6.BAT,文件内容如下:
@ECHO OFF IF EXIST C:\AUTOEXEC.BAT GOTO _COPY GOTO _DONE:_COPY COPY C:\AUTOEXEC.BAT D:\ :_DONE
注意:
- 标号前是ASCII字符的冒号":",冒号与标号之间不能有空格。
- 标号的命名规则与文件名的命名规则相同。
- DOS支持最长八位字符的标号,当无法区别两个标号时,将跳转至最近的一个标号。
6、FOR
建立C:\TEST7.BAT,文件内容如下:
@ECHO OFF FOR %C IN (*.BAT *.TXT *.SYS) DO TYPE %C运行: C:>TEST7
执行以后,屏幕上会将C:盘根目录下所有以BAT、TXT、SYS为扩展名的文件内容显示出来(不包括隐藏文件)。
bat命令的使用
一. 简单批处理内部命令简介
Echo 命令
打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo 命令将显示当前回显设置。
语法
echo [{on off}] [message]
Sample:@echo off / echo hello world
在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> )结合来实现输入一些命令到特定格式的文件中.这将在以后的例子中体现出来。
@ 命令
表示不显示@后面的命令,在入侵过程中(例如使用批处理来格式化敌人的硬盘)自然不能让对方看到你使用的命令啦。
Sample:@echo off
@echo Now initializing the program,please wait a minite...
@format X: /q/u/autoset (format 这个命令是不可以使用/y这个参数的,可喜的是微软留了个autoset这个参数给我们,效果和/y是一样的。)
Goto 命令
指定跳转到标签,找到标签后,程序将处理从下一行开始的命令。
语法:
goto label (label是参数,指定所要转向的批处理程序中的行。)
Sample:
if {%1}=={} goto noparms
if {%2}=={} goto noparms(如果这里的if、%1、%2你不明白的话,先跳过去,后面会有详细的解释。)
@Rem check parameters if null show usage
:noparms
echo Usage: monitor.bat ServerIP PortNumber
goto end
标签的名字可以随便起,但是最好是有意义的字母啦,字母前加个:用来表示这个字母是标签,goto命令就是根据这个:来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。
Rem 命令
注释命令,在C语言中相当与/--------/,它并不会被执行,只是起一个注释的作用,便于别人阅读和你自己日后修改。
Rem Message
Sample:@Rem Here is the description.?
Pause 命令
运行 Pause 命令时,将显示下面的消息:
Press any key to continue . . .
Sample:
@echo off
:begin
copy a:. d:\back
echo Please put a new disk into driver A
pause
goto begin
在这个例子中,驱动器 A 中磁盘上的所有文件均复制到d:\back中。显示的注释提示您将另一张磁盘放入驱动器 A 时,pause 命令会使程序挂起,以便您更换磁盘,然后按任意键继续处理。
Call 命令
从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call 命令接受用作调用目标的标签。如果在脚本或批处理文件外使用 Call,它将不会在命令行起作用。
语法
call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]
参数
[Drive:}[Path] FileName
指定要调用的批处理程序的位置和名称。filename 参数必须具有 .bat 或 .cmd 扩展名。
start 命令
调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。
入侵常用参数:
MIN 开始时窗口最小化
SEPARATE 在分开的空间内开始 16 位 Windows 程序
HIGH 在 HIGH 优先级类别开始应用程序
REALTIME 在 REALTIME 优先级类别开始应用程序
WAIT 启动应用程序并等候它结束
parameters 这些为传送到命令/程序的参数
执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE 不等应用程序终止就返回命令提示。如果在命令脚本内执行,该新行为则不会发生。
choice 命令
这一个命令还不会用,上网再找找资料
choice 使用此命令可以让用户输入一个字符,从而运行不同的命令。使用时应该加/c:参数,c:后应写提示可输入的字符,之间无空格。它的返回码为1234……
如: choice /c:dme defrag,mem,end
将显示
defrag,mem,end[D,M,E]?
Sample:
Sample.bat的内容如下:
@echo off
choice /c:dme defrag,mem,end
基础知识
hello world
windows系统下,按 win+R
输入 cmd
,然后按回车键(enter),即调用了 cmd.exe 程序,后续的指令都通过 cmd.exe 程序执行
:: 输出 hello world
echo hello world
:: 变更窗口标题
title Cmd Window - I Love You
输出指令(echo)
输出消息
echo hi
注释
::
和 rem
表示当前行是注释
:: 我是注释1
rem 我是注释2
@rem 我是注释2
暂停 pause
暂停命令。运行 Pause 命令时,将显示 Press any key to continue. . .(或:请按任意键继续. . .)
echo hi
pause
脚本文件后缀名
通常为 a.bat ,也可以是
- a.cmd
- a.com
- a.vbs vb脚本
- a.hta js脚本
符号
@
@
这个符号在批处理中的作用就是屏蔽掉当前行的回显。
^
^
是对特殊符号 <,>,&,% 的前导字符,在命令中他将以上符号的特殊功能去掉,仅仅只把他们当成符号而不使用他们的特殊意义
>
输出重定向命令,这个字符的意思是传递并且覆盖
echo hello >1.txt
>>
输出重定向命令这,个字符的意思是传递并且追加
echo world >>1.txt
<
输入重定向命令,这个字符的意思是传递并且覆盖
<<
输入重定向命令,个字符的意思是传递并且追加
%%和%
如果一个名称用%括起来,那么就是用的它的赋值,而不是本身的字母。
%%i 这种变量是for 语句里面 特有的变量(还有一种是外部变量,接受外部参数的格式是%1 -%9 共9个变量),只有在批处理里面才写 两个 %% 号表示变量,cmd中只用 一个 % 号
变量
@echo off
set va=hello
set vb=world
echo a+b=%va% %vb%
setlocal enabledelayedexpansion
设置本地为延迟扩展。其实也就是:延迟变量,全称延迟环境变量扩展, 想进阶,变量延迟是必过的一关!所以这一部分希望你能认真看。
批处理中setlocal enabledelayedexpansion的作用详细整理_DOS/BAT_脚本之家
https://www.jb51.net/article/29323.htm
根目录
\\?
windows的命名约定中,路径组合的长度为260字节,但也提供了超长路径的统一访问bai支持,那就是添加可扩展UNC路径\\?\前辍的绝对路径,以便达到最大路径字节32767
\\?\表示了当前电脑的根目录,而各磁盘分区如同在资源管理器中那样,是处于我的电脑之下一阶当中的
\\?\在命令行中无法直接执行文件或切换目录,但大多数内部命令都可以支持这样的路径,例如dir echo start...
至于%1
是自身的意思!
你这个批处理,应该是一个删除脚本,把任何文件拖到该批处理上,它会自动删除这个文件!
Q: 为什么rd /s /q \\.\h:\autorun.inf\这条命令为什么能删除包含畸形文件夹在内的所有文件夹?
\\.\理解为\\127.0.0.1\就行了,当然实际上是行不通的。
UNC的一个本地化特例。
?\可以理解成遍历,?是统配符,表示匹配0个或1个任意字符。
.\代表本地节点,在概念上来有点像磁盘根目录,也可以说成是计算机根目录。
所以dir \\.\C:\是可以被命令行解释器识别的,更可以跨盘符的来使用绝对路径引用
mkdir \\?\D:\tmp\.aaa.
rd \\?\D:\tmp\.aaa.
echo > \\?\D:\tmp\.aaa....js..
del \\?\D:\tmp\.aaa....js..
帮助指令
每个指令通过 /?
参数查看指令可用配置和使用说明,如果还不明白,建议百度一下或者谷歌一下
echo /?
rem /?
流程控制语句
条件判断语句
IF(ELSE)语句
:: 功能:IF 语句
@echo off
@chcp 65001 > NUL
setlocal enabledelayedexpansion
set /p vVal="input value:"
if {%vVal%} == {ac1} (
echo ac1
)
if %vVal% == ac2 (
echo ac2
)
if not %vVal% == ac3 (
echo not ac3
)
if exist %vVal% (
echo exist file %vVal%
) else (
echo not exist file %vVal%
)
循环执行语句
for循环
:: 功能:IF 语句
@echo off
@chcp 65001 > NUL
setlocal enabledelayedexpansion
echo 20以内的奇数
FOR /L %%i IN (1,2,20) DO (
echo Num:%%i
)
echo 遍历父级目录的文件夹列表
FOR /D %%i IN (dir ..\*) DO (
echo 目录名:%%i
)
echo 遍历当前目录的文件列表
FOR /R "." %%i IN (*) DO (
echo 文件名:%%i
)
::这个功能强大,也复杂,需要的时候用,遍历文件用
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
转向语句
goto
@echo off
goto end
:end
echo 结束
控制台输入和脚本文件的区别
目录路径变量
# 当前目录路径
echo current path:%cd%
bat 脚本里面还可以这样判断
echo current path:%~dp0
%0 为当前bat的文件名
~ 扩充符号
d 扩充到分区
p 扩充到路径
功能脚本1
[TOC]
edit-host.bat
功能:编辑 host 文件
@echo off
chcp 65001 > nul
echo 使用记事本打开host文件中
echo 打开host文件成功
notepad "C:\Windows\System32\drivers\etc\hosts"
echo 关闭host文件成功
change-net-card-config.bat
功能:配置指定网卡的ip、子网掩码、网关
:: 目的:实现网卡配置快速切换
@echo off
@chcp 65001 > NUL
setlocal enabledelayedexpansion
:: 网卡1配置
:: 要配置的网卡名称
set netCard1Name=内网
::配置网卡 IP
set netCard1IP=172.16.2.24
:: 配置网卡子网掩码
set netCard1Mask=255.255.255.0
:: 配置网卡网关
set netCard1Gateway=172.16.2.1
:: 网卡2配置
set netCard2Name=内网
set netCard2IP=192.168.11.24
set netCard2Mask=255.255.255.0
set netCard2Gateway=192.168.11.1
:: 网卡3配置
set netCard3Name=内网
set netCard3IP=127.0.0.1
set netCard3Mask=255.255.255.0
set netCard3Gateway=127.0.0.1
:: 网卡4配置
set netCard4Name=内网
set netCard4IP=127.0.0.1
set netCard4Mask=255.255.255.0
set netCard4Gateway=127.0.0.1
:: 网卡5配置
set netCard5Name=内网
set netCard5IP=127.0.0.1
set netCard5Mask=255.255.255.0
set netCard5Gateway=127.0.0.1
:begin
echo --- 网卡配置列表 ---
echo [1] 切换到网卡1配置 网卡名称:!netCard1Name! 网卡ip:!netCard1IP! 子网掩码:!netCard1Mask! 网关:!netCard1Gateway!
echo [2] 切换到网卡2配置 网卡名称:!netCard2Name! 网卡ip:!netCard2IP! 子网掩码:!netCard2Mask! 网关:!netCard2Gateway!
echo [3] 切换到网卡3配置 网卡名称:!netCard3Name! 网卡ip:!netCard3IP! 子网掩码:!netCard3Mask! 网关:!netCard3Gateway!
echo [4] 切换到网卡4配置 网卡名称:!netCard4Name! 网卡ip:!netCard4IP! 子网掩码:!netCard4Mask! 网关:!netCard4Gateway!
echo [5] 切换到网卡5配置 网卡名称:!netCard5Name! 网卡ip:!netCard5IP! 子网掩码:!netCard5Mask! 网关:!netCard5Gateway!
echo ------------
choice /C 12345 /M 请选择切换到的网卡配置
echo 您选择了%errorlevel%
if %errorlevel%==1 goto config1
if %errorlevel%==2 goto config2
if %errorlevel%==3 goto config3
if %errorlevel%==4 goto config4
if %errorlevel%==5 goto config5
:config1
set netCardName=!netCard1Name!
set netCardIP=!netCard1IP!
set netCardMask=!netCard1Mask!
set netCardGateway=!netCard1Gateway!
goto end
:config2
set netCardName=!netCard2Name!
set netCardIP=!netCard2IP!
set netCardMask=!netCard2Mask!
set netCardGateway=!netCard2Gateway!
goto end
:config3
set netCardName=!netCard3Name!
set netCardIP=!netCard3IP!
set netCardMask=!netCard3Mask!
set netCardGateway=!netCard3Gateway!
goto end
:config4
set netCardName=!netCard4Name!
set netCardIP=!netCard4IP!
set netCardMask=!netCard4Mask!
set netCardGateway=!netCard4Gateway!
goto end
:config5
set netCardName=!netCard5Name!
set netCardIP=!netCard5IP!
set netCardMask=!netCard5Mask!
set netCardGateway=!netCard5Gateway!
goto end
:end
netsh interface ip set address name=!netCardName! source=static addr=!netCardIP! mask=!netCardMask! gateway=!netCardGateway!
echo 配置成功
chcp-utf8.bat
功能:实现 cmd.exe 执行编码转换
cmd.exe 默认编码是gbk,这里从默认的 gbk(936) 切换为 utf-8(65001) 。
在以前,中文的汉字编码是 gbk, gb2312 等等,所以控制台程序的默认编码页是 gbk 的,即如果你编写的脚本含有中文,编码为 gbk 脚本执行中输出的汉字会正常显示,但是现在都统一使用 utf8 编码了,甚至新建的文本文件默认都是 utf8 编码,但是 cmd.exe 的默认识别编码还是 gbk,所以 utf8 编写的脚本执行会乱码,办法就是把cmd.exe 的执行编码改为 utf8,跟上时代进程。
@echo off
echo change file encode to utf-8
chcp 65001 > nul
echo 现在我是 utf8 编码了
echo abc123
pause
asm-compile.bat
功能:用于编写汇编程序的时候自动编译链接
:: close echo
@echo off
:: set variable delay
Setlocal enabledelayedexpansion
::clean screen
cls
:: display info
echo CODER BY DHclly POWERD BY iBAT
echo this program is for auto make the masm program
echo mailto me : 335121817@qq.com
:: if input without paramater goto usage
if "%1"=="" goto usage
:: if paramater is "/?" goto usage
if "%1"=="/?" goto usage
:: if paramater is "help" goto usage
if "%1"=="help" goto usage
:: pause to see usage
pause
:: assemble the .asm code file
masm %1.asm
::if error pause to see error msg and edit the code
if errorlevel 1 pause & edit %1.asm
::link the *.obj file and execute the *.exe file
link %1.obj & %1
:: set usage
:usage
echo Usage: if the filename is start.asm , then call : asm-compile.bat start
pause
ice-river.bat
功能:用于检测一种叫做冰河的病毒,此病毒会使用7626端口,(没用了,已经是老黄历了)
@echo off
Setlocal enabledelayedexpansion
::CODER BY DHclly POWERD BY iBAT
netstat -a -n > iceriver.txt
type iceriver.txt | find "7626" && echo "Congratulations! You have infected GLACIER!"
del iceriver.txt
pause
explorer-current-path.bat
功能:使用文件资源管理器浏览当前路径
explorer %cd%
explorer-current-user-ssh-folder.bat
功能:浏览当前用户的 .ssh 文件夹
explorer %HOMEPATH%\.ssh
create-file.bat
功能:创建文件
type NUL > a.txt
type NUL > error.log
echo great > my.txt
rename-current-folder-jpg-file.bat
:: 禁止执行一条就输出一条结果
@echo off
:: 变更为utf-8
chcp 65001
::开启延迟的变量扩充
setlocal enabledelayedexpansion
::计数器,定义变量 i,为数字,可以进行数学运算
set /a i=1
:: for 循环变量当前文件夹中所有的 .jpg 结尾的文件
:: 定义变量 %%f 表示当前文件
for %%f in (*.jpg) do (
:: 重命名当前文件名称
:: !i! 是读取i的值
ren %%f picure-!i!.jpg
:: 重新对变量 i 赋值
set /a i=!i!+1
)
display-system-variables.bat
功能:显示系统变量
@echo off
@chcp 65001
echo 常见系统环境变量
echo 系统环境变量名:[^%%AllUsersProfile^%%],值:[%AllUsersProfile%]
echo 系统环境变量名:[^%%AppData^%%],值:[%AppData%]
echo 系统环境变量名:[^%%CommonProgramFiles^%%],值:[%CommonProgramFiles%]
echo 系统环境变量名:[^%%CommonProgramFiles(x86)^%%],值:[%CommonProgramFiles(x86)%]
echo 系统环境变量名:[^%%ComSpec^%%],值:[%ComSpec%]
echo 系统环境变量名:[^%%HomeDrive^%%],值:[%HomeDrive%]
echo 系统环境变量名:[^%%SystemDrive^%%],值:[%SystemDrive%]
echo 系统环境变量名:[^%%HomePath^%%],值:[%HomePath%]
echo 系统环境变量名:[^%%LocalAppData^%%],值:[%LocalAppData%]
echo 系统环境变量名:[^%%ProgramData^%%],值:[%ProgramData%]
echo 系统环境变量名:[^%%ProgramFiles^%%],值:[%ProgramFiles%]
echo 系统环境变量名:[^%%ProgramFiles(x86)^%%],值:[%ProgramFiles(x86)%]
echo 系统环境变量名:[^%%Public^%%],值:[%Public%]
echo 系统环境变量名:[^%%SystemRoot^%%],值:[%SystemRoot%]
echo 系统环境变量名:[^%%Temp^%%],值:[%Temp%]
echo 系统环境变量名:[^%%Tmp^%%],值:[%Tmp%]
echo 系统环境变量名:[^%%UserProfile^%%],值:[%UserProfile%]
echo 系统环境变量名:[^%%WinDir^%%],值:[%WinDir%]
gen-any-count-file.bat
功能:根据传入参数生成指定数量的文件,文件均含有内容,为当前文件的生成序号
:: 功能:根据传入参数生成指定数量的文件,文件均含有内容,为当前文件的生成序号
:: 作者:DHclly
@echo off
@chcp 65001 > NUL
setlocal enabledelayedexpansion
set execScriptName=%0
set fileCount=%1
set distPath=%2
if {!fileCount!} == {} (
echo 未指定文件生成数量,使用默认值:1
set fileCount=1
)
if {!distPath!} == {} (
echo 没有指定路径,使用默认路径:.\files
set distPath=.\files
if not exist !distPath! (
echo 默认路径也不存在,创建默认路径 !distPath!
mkdir !distPath!
)
)
if not exist !distPath! (
echo 不存在指定路径,创建路径 !distPath!
mkdir !distPath!
)
echo ----------------------------
echo 执行脚本名:%execScriptName%
echo 生成 %fileCount% 个文件
echo 输出路径:%distPath%
echo 开始生成文件。。。
FOR /L %%i IN (1,1,!fileCount!) DO (
echo 生成文件%%i
echo %%i > %distPath%\file%%i.txt
)
echo 执行成功!
one-key-build-push-nuget.bat
功能:一键构建nuget包
:: 功能:一键构建nuget包
:: 作者:DHclly
@echo off
@chcp 65001 > NUL
setlocal enabledelayedexpansion
echo 查找 csproj 文件
dir/a-d /b *.csproj > result.txt
(set/p csprojFileName=)<result.txt
del result.txt
echo 找到 csproj文件名:!csprojFileName!
echo 开始构建程序发布
dotnet build -c release !csprojFileName!
echo 开始打包 nuget 包
dotnet pack -c release !csprojFileName!
echo 查找 nuget包文件
cd .\bin\release
dir/a-d /b *.nupkg > result.txt
(set/p nupkgFile=)<result.txt
echo 找到 nuget 包:!nupkgFile!
echo 开始推送 nuget 包
dotnet nuget push -k keyval -s host !nupkgFile!.nupkg
del result.txt
echo 执行成功!
pause
delete-files.bat
功能:删除文件
ERASE/DEL
del file1.txt file2.txt
:: 删除目录里面所有的文件
del dirName
delete-folders.bat
功能:删除文件夹
RMDIR/RD
rd /s folder1
copy-files.bat
功能:复制文件
copy calc-ab.bat calc-ab2.bat
copy-folder.bat
功能:复制文件夹
:: 目的:复制文件夹
@echo off
@chcp 65001 > NUL
setlocal enabledelayedexpansion
set src=%1
set dist=%2
xcopy !src! !dist! /C /E /H /K /R /Y /I
choice-drink.bat
@echo off
::change file encode to utf-8 and hide change info
chcp 65001 > nul
:begin
echo ------------
echo --- 菜单 ---
echo [1] 可口可乐
echo [2] 农夫山泉
echo [3] 乌龙茶
echo [4] 绿茶
echo [5] 白开水
choice /C 12345 /M 请选择想喝的饮料
echo 您选择了%errorlevel%
if %errorlevel%==1 goto case1
if %errorlevel%==2 goto case2
if %errorlevel%==3 goto case3
if %errorlevel%==4 goto case4
if %errorlevel%==5 goto case5
:case1
echo 可口可乐没得了,请重新选择
goto begin
:case2
echo 农夫山泉没得了,请重新选择
goto begin
:case3
echo 乌龙茶没得了,请重新选择
goto begin
:case4
echo 绿茶没得了,请重新选择
goto begin
:case5
echo 给您一杯白开水
goto end
:end
echo 结束
mklink
创建(软硬)链接,输入 mklink
查看帮助
可以用来把存在C盘的文件实际上存储在其他盘上,如果是通过创建文件夹快捷方式的情况则是不能当做文件夹进行访问的
# 文件软连接
mklink a1.txt a.txt
mklink a2.txt a.txt
mklink a3.txt a.txt
# 文件硬链接
mklink /H a4.txt a.txt
mklink /H a5.txt a.txt
# 文件夹软连接(相对路径)
mklink /D aa2 aa
mklink /D aa3 aa
# 文件夹软连接(绝对路径)
mklink /J aa4 aa
mklink /J aa5 aa
# 帮助
mklink /?
# 创建符号链接。
MKLINK [[/D] | [/H] | [/J]] Link Target
/D 创建目录符号链接。默认为文件符号链接。
/H 创建硬链接而非符号链接。
/J 创建目录联接。
Link 指定新的符号链接名称。
Target 指定新链接引用的路径(相对或绝对)。
目录结构
# 创建目录
# 创建文件
mkdir fa fb fc
type NUL>f1.txt
type NUL>f2.txt
把文件夹B 软连接到当前目录命名链接为 A
mklink /D ./A ./B
mklink /D .\Wechats "E:\soft-link\Wechats"
默认创建文件的软连接(快捷方式)
# 创建 f1.txt的符号链接 f1-a.txt
mklink f1-a.txt f1.txt
# 创建文件夹的符号链接
mklink /D fa-c fa
软链接和硬链接的区别(windows
和linux
通用)
关于mklink的/D /J 区别_运维_NotBack的编程专栏-CSDN博客
https://blog.csdn.net/notback/article/details/73604292
软连接,其实就是新建立一个文件,这个文件就是专门用来指向别的文件的(那就和windows 下的快捷方式的那个文件有很接近的意味)
软链接产生的是一个新的文件,但这个文件的作用就是专门指向某个文件的,删了这个软连接文件,那就等于不需要这个连接,和原来的存在的实体原文件没有任何关系,但删除原来的文件,则相应的软连接不可用(cat那个软链接文件,则提示“没有该文件或目录“)
硬连接是不会建立inode
的,他只是在文件原来的inode link count
域再增加1而已,也因此硬链接是不可以跨越文件系统的
相反是软连接会重新建立一个inode
,当然inode
的结构跟其他的不一样,他只是一个指明源文件的字符串信息。一旦删除源文件,那么软连接将变得毫无意义。而硬链接删除的时候,系统调用会检查inode link count
的数值,如果他大于等于1,那么inode
不会被回收。因此文件的内容不会被删除。
硬链接实际上是为文件建一个别名,链接文件和原文件实际上是同一个文件。可以通过ls -i
来查看一下,这两个文件的inode
号是同一个,说明它们是同一个文件;而软链接建立的是一个指向,即链接文件内的内容是指向原文件的指针,它们是两个文件。
软链接可以跨文件系统,硬链接不可以;
软链接可以对一个不存在的文件名(filename)进行链接(当然此时如果你vi这个软链接文件,linux
会自动新建一个文件名为filename
的文件),硬链接不可以(其文件必须存在,inode
必须存在);
软链接可以对目录进行连接,硬链接不可以。
两种链接都可以通过命令 ln
来创建。ln
默认创建的是硬链接。
使用 -s
开关可以创建软链接(windows中是用 /H
创建硬链接,默认是软连接)。
mklink 其他我就不介绍了
由于/d /j 实在太像,所以这里实验和总结一下。
区别1:创建
/d 可以使用相对路径方式创建
/j 必须绝对路径方式创建
此区别意义不大,建议所有的mklink目录均用绝对路径创建
别2:复制和剪切
复制:/d /j 均生成源目录的内容副本,变为一般文件夹
剪切/移动:/d 生成的目录,移动到其他地方,仍旧保持链接。对源目录无影响,/d生成的目录消失
/j 生成的目录,移动到其他地方,会产生一个新的副本文件夹,源文件夹内容全部移至新普通文件夹内,源文件夹清空,源文件夹仍旧存在,/j生成的目录也依旧存在
PATH
set
用于查看环境变量
https://www.cnblogs.com/saptechnique/archive/2013/02/17/2914222.html
修改PATH值
set path=%path%;加需要设定的路径
配置环境变量
配置环境变量.bat_FireGhost57的专栏-CSDN博客_bat env
https://blog.csdn.net/fireghost57/article/details/21103329
:: ==============================
:: code by fireghost57
:: modify: 2014.3.12
:: ==============================
@echo off
::设定环境变量
set "add_path1=D:\Oracle\product\10.2.0\db_1\bin"
set "env_path1=ORACLE_HOME"
::检查PATH中是否已添加
wmic ENVIRONMENT where "name='PATH'" get VariableValue|findstr /i /c:"%add_path1%">nul&&(goto PATH_EXIST)
echo PATH环境变量中未添加: %add_path1%
echo.
echo 添加环境变量
echo.
set "set_val=%add_path1%;%PATH%"
wmic ENVIRONMENT where "name='PATH' and username='<system>'" set VariableValue="%set_val%"
:PATH_EXIST
echo PATH环境变量中已添加: %add_path1%
echo.
::检查是否已创建环境变量
wmic ENVIRONMENT where "name='%env_path1%'" get VariableValue|findstr /i /c:"VariableValue">nul&&(goto ENV_CREATE)
echo %env_path1%环境变量未创建
echo.
echo 创建环境变量
echo.
wmic ENVIRONMENT create name="%env_path1%",username="<system>",VariableValue="%add_path1%"
:ENV_CREATE
echo %env_path1%环境变量已创建
echo.
echo 配置完成,按任意键还原环境变量
echo.
pause>nul
echo 还原环境变量
echo.
set set_val=
:loop_findpath
set /a n+=1
for /f "tokens=%n% delims=;" %%a in ('wmic ENVIRONMENT where "name='PATH'" get VariableValue^|findstr /i /c:"%add_path1%"') do (
if "%%a" neq "" (
if "%%a" neq "%add_path1%" (
if "%set_val%" == "" (
set "set_val=%%a"
) else (
set "set_val=%set_val%;%%a"
)
)
goto loop_findpath
)
)
wmic ENVIRONMENT where "name='PATH' and username='<system>'" set VariableValue="%set_val%"
echo 删除环境变量
echo.
wmic ENVIRONMENT where "name='%env_path1%'" delete
echo 环境变量已还原
echo.
pause>nul
path
一行行输出path的内容
setlocal enabledelayedexpansion
set n=^
echo %path:;=!n!%
@echo off&del /a/q 234.txt 2>nul&set b=1
:1
for /f "tokens=%b% delims=;" %%c in ("%path%")do (
set/a b+=1
set "d=%%c"
call echo %%d%%>>234.txt
)&&goto 1
start 234.txt
xcopy
@echo off
echo start copy
echo d | xcopy src dist /C /E /H /K /R /Y
copy
copy dll %windir%\system32\
regsvr32 %windir%\system32\dll /s
echo 指令
输出文本
操作记录
echo hello world
::输出并暂停
echo hello world
pause
::禁止回显
@echo hello world
pause
@echo off
@echo on
:: 要输出 on off 加个 .
@echo. open on
dir 指令
dir 列出当前文件夹下的文件列表
[TOC]
常用
只列出名称
dir /b
列出绝对路径
dir /b/s
指令记录
:: 默认指令
dir
:: 查看帮助
dir /?
::只看文件夹
dir /ad
::列出不包括文件夹的文件 - 表示“否”的前缀
dir /a-d
::只列出名称
dir /b
::列出绝对路径
dir /b/s
参数说明
DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]
[/O[[:]sortorder]] [/P] [/Q] [/R] [/S] [/T[[:]timefield]] [/W] [/X] [/4]
[drive:][path][filename]
指定要列出的驱动器、目录和/或文件。
/A(Attribute) 显示具有指定属性的文件。
属性 D(Directory) 目录 R 只读文件
H 隐藏文件 A 准备存档的文件
S 系统文件 I 无内容索引文件
L 重新分析点 O 脱机文件
- 表示“否”的前缀
/B 使用空格式(没有标题信息或摘要)。
/C 在文件大小中显示千位数分隔符。这是默认值。用 /-C 来
禁用分隔符显示。
/D 跟宽式相同,但文件是按栏分类列出的。
/L 用小写。
/N 新的长列表格式,其中文件名在最右边。
/O 用分类顺序列出文件。
排列顺序 N 按名称(字母顺序) S 按大小(从小到大)
E 按扩展名(字母顺序) D 按日期/时间(从先到后)
G 组目录优先 - 反转顺序的前缀
/P 在每个信息屏幕后暂停。
/Q 显示文件所有者。
/R 显示文件的备用数据流。
/S 显示指定目录和所有子目录中的文件。
/T 控制显示或用来分类的时间字符域
时间段 C 创建时间
A 上次访问时间
W 上次写入的时间
/W 用宽列表格式。
/X 显示为非 8dot3 文件名产生的短名称。格式是 /N 的格式,
短名称插在长名称前面。如果没有短名称,在其位置则
显示空白。
/4 以四位数字显示年份
可以在 DIRCMD 环境变量中预先设定开关。通过添加前缀 - (破折号)
来替代预先设定的开关。例如,/-W。
choice 指令
@echo off
::change file encode to utf-8 and hide change info
chcp 65001 > nul
:begin
echo ------------
echo --- 菜单 ---
echo [1] 可口可乐
echo [2] 农夫山泉
echo [3] 乌龙茶
echo [4] 绿茶
echo [5] 白开水
choice /C 12345 /M 请选择想喝的饮料
echo 您选择了%errorlevel%
if %errorlevel%==1 goto case1
if %errorlevel%==2 goto case2
if %errorlevel%==3 goto case3
if %errorlevel%==4 goto case4
if %errorlevel%==5 goto case5
:case1
echo 可口可乐没得了,请重新选择
goto begin
:case2
echo 农夫山泉没得了,请重新选择
goto begin
:case3
echo 乌龙茶没得了,请重新选择
goto begin
:case4
echo 绿茶没得了,请重新选择
goto begin
:case5
echo 给您一杯白开水
goto end
:end
echo 结束
sc
查询Terminal Service的配置
sc qc termservice
关闭Terminal Service服务
sc stop termservice
查询Terminal Service服务
sc query termservice
SC命令创建和删除windows服务_dz45693的专栏-CSDN博客
https://blog.csdn.net/ma_jiang/article/details/77894943
sc [ServerName] delete [ServiceName]
# 双引号嵌套
sc delete "\"a\""
sc create svnservice binpath= "\"D:\Servers\Subversion\bin\svnserve.exe\" --service -r E:\SVN\repository" displayname= "SVNService" depend= Tcpip start= auto
set 指令
常用操作
:: 显示当前环境变量列表
set
:: 筛选环境变量,如下是筛选以 program 开头的环境变量
set program
:: 设置变量为数字,并可以进行计算
set /a vNum1=5
set /a vNum2=8
set /a vNum3="%vNum1%+%vNum2%"
echo %vNum3%
:: 获取用户输入
set /p vName="please enter your name:"
echo your name is %vName%
显示当前环境变量列表
:: 显示当前环境变量列表
set
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\User1\AppData\Roaming
CommonProgramFiles=C:\Program Files\Common Files
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
CommonProgramW6432=C:\Program Files\Common Files
COMPUTERNAME=User1
ComSpec=C:\WINDOWS\system32\cmd.exe
DriverData=C:\Windows\System32\Drivers\DriverData
HOMEDRIVE=C:
HOMEPATH=\Users\User1
LOCALAPPDATA=C:\Users\User1\AppData\Local
LOGONSERVER=\\WIN-734B73J90GU
NUMBER_OF_PROCESSORS=12
NVM_HOME=C:\Users\User1\AppData\Roaming\nvm
NVM_SYMLINK=C:\Program Files\nodejs
OneDrive=C:\Users\User1\OneDrive
OS=Windows_NT
Path=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\;C:\Program Files\Git\cmd;C:\Program Files\dotnet\;C:\Users\User1\AppData\Roaming\npm;C:\Program Files (x86)\Microsoft SQL Server\150\DTS\Binn\;C:\Program Files\Azure Data Studio\bin;C:\Program Files\Docker\Docker\resources\bin;C:\ProgramData\DockerDesktop\version-bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Users\User1\AppData\Local\Microsoft\WindowsApps;C:\Users\User1\.dotnet\tools;C:\Users\User1\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\User1\AppData\Local\GitHubDesktop\bin;C:\Users\User1\AppData\Roaming\nvm;C:\Program Files\nodejs;C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64;C:\Users\User1\AppData\Local\Programs\Python\Python38\Scripts\;C:\Users\User1\AppData\Local\Programs\Python\Python38\;C:\Users\User1\AppData\Local\Microsoft\WindowsApps;C:\Users\User1\.dotnet\tools;C:\Users\User1\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\User1\AppData\Local\GitHubDesktop\bin;C:\Program Files\Azure Data Studio\bin;C:\Users\User1\AppData\Roaming\nvm;C:\Program Files\nodejs
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 165 Stepping 5, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=a505
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)
ProgramW6432=C:\Program Files
PROMPT=$P$G
PSModulePath=C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules
PUBLIC=C:\Users\Public
PYTHON_HOME=C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64
SESSIONNAME=Console
SystemDrive=C:
SystemRoot=C:\WINDOWS
TEMP=C:\Users\User1\AppData\Local\Temp
TMP=C:\Users\User1\AppData\Local\Temp
USERNAME=User1
USERPROFILE=C:\Users\User1
windir=C:\WINDOWS
WXDRIVE_START_ARGS=--wxdrive-setting=0 --disable-gpu --disable-software-rasterizer --enable-features=NetworkServiceInProcess
帮助
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% - 扩展到调用命令处理器的原始命令行。
%HIGHESTNUMANODENUMBER% - 扩展到此计算机上的最高 NUMA 节点号。
route 指令
route print
::删除默认路由地址,多网卡会有多个
route delete 0.0.0.0
::把默认地址加到外网网段
route add -4 -p 0.0.0.0 mask 0.0.0.0 192.168.11.1 METRIC 1
::对内网网段设置单独路由
route add -4 -p 172.16.0.0 mask 255.255.255.0 172.16.2.1 METRIC 1
subst指令
systeminfo 指令
查看系统信息
wmic 指令
执行 wmic
wmic
在wmic里面输入
/?
cpu get *
rem 查看cpu
wmic cpu list brief
rem 查看物理内存
wmic memphysical list brief
rem 查看逻辑内存
wmic memlogical list brief
rem 查看缓存内存
wmic memcache list brief
rem 查看虚拟内存
wmic pagefile list brief
rem 查看网卡
wmic nic list brief
rem 查看网络协议
wmic netprotocal list brief
如何在windows系统自带命令查看硬件信息?
对于在windows下查看系统信息大家一定不陌生了,我现在说几个最常用的方法,对命令感兴趣的朋友看看,(给菜鸟看的,老手就不要笑话我了,大家都是从那个时候过来的,^_^)。
一.图新Shell下:
- 最直观的:(在运行里面输入CMD,以下命令都是在CMD下输入的:)
输入 sysdm.cpl, 系统属性. - 输入dxdiag
3.输入 start msinfo32,winmsd系统信息 - 输入 devmgmt.msc,设备管理:
- 输入 taskmgr (或按Ctrl+Alt+Esc) 在性能选项卡看物理内存和pagefile
- 输入 winver 也可以查看内存大小
怎样dos命令(cmd命令)查看硬盘和内存/CPU信息?
1.查看磁盘信息:freedisk 可以查看每一个盘的剩余空间
wmic diskdrive
可以看出来牌子和大小.
Wmic logicaldisk
可以看到有几个盘,每一个盘的文件系统和剩余空间
wmic volume
每个盘的剩余空间量,其实上一个命令也可以查看的
fsutil volume diskfree c:
这个命令查看每一个卷的容量信息是很方便
2.CPU信息
wmic cpu
上面显示的有位宽,最大始终频率, 生产厂商,二级缓存等信息
3.内存信息
wmic memorychip
可以显示出来三条内存,两条256,一条1G的,速度400MHz
4.BIOS信息
wmic bios
netsh 指令
NetSH 网络配置命令行工具 – 何星星
https://hexingxing.cn/netsh/
netsh (Network Shell) 是一个 windows 系统本身提供的功能强大的网络配置命令行工具。导出配置脚本:netsh -c interface ip dump > c:\interface.txt导入配置脚本:netsh -f c:\interface.txt。
netsh interface ip show address - 显示 IP 地址netsh interface ip show config - 显示更多详情netsh interface ip show ipaddress - 显示 IP 地址类型netsh interface ip show ipnet - 显示网络到媒体项目netsh interface ip show route - 显示当前路由信息netsh interface ip show interface - 显示接口信息netsh interface ip set address "以太网" dhcp - 通过 DHCP 设置 IP 地址netsh interface ip set address "以太网" static 10.1.2.10 255.255.255.0 10.1.2.254 - 设置以太网 IP 地址
netsh interface ip show dns - 显示 DNS 地址netsh interface ip set dns "以太网" dhcp - 通过 DHCP 设置 DNS 地址netsh interface ip set dns "以太网" static 10.0.12.8 - 设置以太网 DNS 地址,清除原有 DNS 设置netsh interface ip add dns "以太网" 114.114.114.114 index=2 - 添加以太网 DNS 地址,index 为自定义排序netsh interface ip add dns "以太网" 8.8.8.8 index=3 - 添加以太网 DNS 地址,index 为自定义排序netsh interface ip add dns "以太网" 1.1.1.1 index=4 - 添加以太网 DNS 地址,index 为自定义排序netsh interface ip add dns "以太网" 223.5.5.5 index=5 - 添加以太网 DNS 地址,index 为自定义排序
netsh -c interface dump > d:\1.txt 导出配置到 D 盘并命名为 1.txt
netsh -f d:\2.txt 导入在 D 盘命名为 2.txt 的配置文件
C:\Users\Administrator>netsh
abort – 丢弃在脱机模式下所做的更改。
add – 在项目列表上添加一个配置项目。
advfirewall – 更改到 netsh advfirewall’ 上下文。 alias – 添加一个别名 branchcache – 更改到
netsh branchcache’ 上下文。
bridge – 更改到 netsh bridge’ 上下文。 bye – 退出程序。 commit – 提交在脱机模式中所做的更改。 delete – 在项目列表上删除一个配置项目。 dhcpclient – 更改到
netsh dhcpclient’ 上下文。
dnsclient – 更改到 netsh dnsclient’ 上下文。 dump – 显示一个配置脚本。 exec – 运行一个脚本文件。 exit – 退出程序。 firewall – 更改到
netsh firewall’ 上下文。
help – 显示命令列表。
http – 更改到 netsh http’ 上下文。 interface – 更改到
netsh interface’ 上下文。
ipsec – 更改到 netsh ipsec’ 上下文。 lan – 更改到
netsh lan’ 上下文。
mbn – 更改到 netsh mbn’ 上下文。 namespace – 更改到
netsh namespace’ 上下文。
netio – 更改到 netsh netio’ 上下文。 offline – 将当前模式设置成脱机。 online – 将当前模式设置成联机。 p2p – 更改到
netsh p2p’ 上下文。
popd – 从堆栈上打开一个上下文。
pushd – 将当前上下文放入堆栈。
quit – 退出程序。
ras – 更改到 netsh ras’ 上下文。 rpc – 更改到
netsh rpc’ 上下文。
set – 更新配置设置。
show – 显示信息。
trace – 更改到 netsh trace’ 上下文。 unalias – 删除一个别名。 wcn – 更改到
netsh wcn’ 上下文。
wfp – 更改到 netsh wfp’ 上下文。 winhttp – 更改到
netsh winhttp’ 上下文。
winsock – 更改到 netsh winsock’ 上下文。 wlan – 更改到
netsh wlan’ 上下文。
>netsh winsock
audit – 显示已经安装和删除的 Winsock LSP 列表。
dump – 显示一个配置脚本。
help – 显示命令列表。
remove – 从系统中删除 Winsock LSP。
reset – 重置 Winsock 目录为清除状态。
set – 设置 Winsock 选项。
show – 显示信息。
>netsh interface
6to4 – 更改到 netsh interface 6to4′ 上下文。 ? – 显示命令列表。 dump – 显示一个配置脚本。 help – 显示命令列表。 httpstunnel – 更改到
netsh interface httpstunnel’ 上下文。
ipv4 – 更改到 netsh interface ipv4′ 上下文。 ipv6 – 更改到
netsh interface ipv6′ 上下文。
isatap – 更改到 netsh interface isatap’ 上下文。 portproxy – 更改到
netsh interface portproxy’ 上下文。
set – 设置配置信息。
show – 显示信息。
tcp – 更改到 netsh interface tcp’ 上下文。 teredo – 更改到
netsh interface teredo’ 上下文。
>netsh interface ipv4
add – 在一个表格中添加一个配置项。
delete – 从一个表格中删除一个配置项。
dump – 显示一个配置脚本。
help – 显示命令列表。
install – 安装 IP 协议。
reset – 重置 IP 配置。
set – 设置配置信息。
show – 显示信息。
uninstall – 卸载 IP 协议。
>netsh interface ipv4 set
set address – 设定通向接口的 IP 地址或默认网关。
set compartment – 修改分段配置参数。
set dnsservers – 设置 DNS 服务器模式和地址。
set dynamicportrange – 修更改态端口分配所使用端口的范围。
set global – 修改全局配置常规参数。
set interface – 修改 IP 的接口配置参数。
set neighbors – 设置邻居地址。
set route – 修改路由参数。
set subinterface – 修改子接口配置参数。
set winsservers – 设置 WINS 服务器模式和地址。
>netsh interface ipv4 show
show addresses – 显示 IP 地址配置。
show compartments – 显示分段参数。
show config – 显示 IP 地址和其他信息。
show destinationcache – 显示目标缓存项目。
show dnsservers – 显示 DNS 服务器地址。
show dynamicportrange – 显示动态端口范围配置参数。
show excludedportrange – 显示所有排除的端口范围。
show global – 显示全局配置普通参数。
show icmpstats – 显示 ICMP 统计。
show interfaces – 显示接口参数。
show ipaddresses – 显示当前 IP 地址。
show ipnettomedia – 显示 IP 的网络到媒体的映射。
show ipstats – 显示 IP 统计。
show joins – 显示加入的多播组。
show neighbors – 显示邻居缓存项。
show offload – 显示卸载信息。
show route – 显示路由表项目。
show subinterfaces – 显示子接口参数。
show tcpconnections – 显示 TCP 连接。
show tcpstats – 显示 TCP 统计。
show udpconnections – 显示 UDP 连接。
show udpstats – 显示 UDP 统计。
show winsservers – 显示 WINS 服务器地址。
>netsh interface ipv4 add
add address – 将静态 IP 地址或默认网关添加到指定接口。
add dnsservers – 添加一个静态 DNS 服务器地址。
add excludedportrange – 为连续的端口块添加排除。
add neighbors – 添加邻居地址。
add route – 在接口上添加路由。
add winsservers – 添加一个静态 WINS 服务器地址。
ping 指令
ping localhost
发表评论