欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

window的dos命令学习笔记 七

程序员文章站 2022-04-24 07:53:11
...

一、dos历史学习笔记

window的dos命令学习笔记 一

window的dos命令学习笔记 二

window的dos命令学习笔记 三

window的dos命令学习笔记 四

window的dos命令学习笔记 五

window的dos命令学习笔记 六

二、执行状态返回值(%errorlevel%,和shell中$?相似):

有些命令在执行之后将会返回一定的错误值(errorlevel),可以通过errorlevel的值判断命令执行的状况。
获取返回值errorlevel的方法就是,在执行命令后,立马调用返回值errorlevel,如echo %errorlevel%或者if %errorlevel%==1等命令。当返回值为0就是执行成功,当返回值为1表示不成功。

比如:
分别以:192.168.1.1和8.8.8.8俩个ip进行ping测试:

@echo off
ping 192.168.1.1
IF ERRORLEVEL 1 goto MySuccess
IF ERRORLEVEL 0 goto MyFail

:MyFail
echo 命令执行成功!
goto Goodbye
:MySuccess
echo 命令执行失败!
goto Goodbye
:Goodbye
echo 命令已执行,结果显示在上面。
pause

执行结果:
window的dos命令学习笔记 七

将需要ping的ip换成8.8.8.8,结果就成功了。可以看出8.8.8.8这个ping成功了。其实这个状态码和shell的$?有相似的效果,shell中的$?
shell脚本中:

if [ $? -ne 0 ];then
    上一命令执行失败时的操作

else
    上一命令执行成功时的操作
fi

其中,-ne代表不等于,$?代表状态值。

三、视窗

首先我们要DIY它的窗口。使用命令:color、mode、msg。

–1、设置窗口背景色和字体颜色by color。详细内容参见color /?。
–2、设置窗口大小by “MODE CON [COLS=c] [LINES=n]”,cols即宽度,lines即高度。
–3、GUI交互窗口by msg。详细内容参见msg /?。

1、color

设置默认的控制台前景和背景颜色。

COLOR [attr]

attr 指定控制台输出的颜色属性。

颜色属性由两个十六进制数字指定 – 第一个对应于背景,第二个对应于前景。每个数字
可以为以下任何值:

0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 浅绿色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色

如果没有给定任何参数,此命令会将颜色还原到 CMD.EXE 启动时的颜色。这个值来自当前控制台窗口、/T 命令行开关或 DefaultColor 注册表值。

如果尝试使用相同的前景和背景颜色来执行 COLOR 命令,COLOR 命令会将 ERRORLEVEL 设置为 1。

示例:
"COLOR fc" 在亮白色上产生淡红色

window的dos命令学习笔记 七

2、mode

window的dos命令学习笔记 七

cols即宽度,lines即高度。

mode con cols=50 lines=20

执行之后窗口自动变小了。
window的dos命令学习笔记 七
再次输入mode,不加任何参数:即显示状态信息。
window的dos命令学习笔记 七

3、msg

E:\000dos\7笔记七>msg /?
将消息发送给用户。

MSG {username | sessionname | sessionid | @filename | *}
    [/SERVER:servername] [/TIME:seconds] [/V] [/W] [message]

  username            标识指定的用户名。
  sessionname         会话名。
  sessionid           会话 ID。
  @filename           识别这样一个文件,该文件含有将所发消息发送到的用户
                      名、会话名和会话标识号的列表。
  *                   给指定服务器上的所有会话发送信息。
  /SERVER:servername  要联系的服务器(默认值是当前值)。
  /TIME:seconds       等待接收器确认消息的时间延迟。
  /V                  显示有关执行的操作的信息。
  /W                  等待用户的响应,跟 /V 一起有用。
  message             要发送的消息。如果没有指定,发出提示,或者从 stdin
                      读取。

4、 视窗DIY举例:

@echo off
set a=10
set b=0
:tex
set /a a+=3
set /a b+=1
mode con cols=%a% lines=%b%
if %a% lss 60 goto :tex

echo O(∩_∩)O 圣诞快乐 O(∩_∩)O
set a=15,a6,2e,d0,34,8b,4f,9d,5e
for %%i in (%a%) do (
ping -n 2 127.1>nul
color %%i
)
for %%i in (%a%,%a%) do (
ping -n 1 127.1>nul
color %%i
)
>>ms.txt echo          */.    .   .    *      .
>>ms.txt echo          .\*    .    []           * __
>>ms.txt echo          */ .   ./\~~~~~~~~~~~~'\. ^|◆
>>ms.txt echo           \*   ,/,..,\,...........,\.◆
>>ms.txt echo           ^|^| ..▎# ▎田 田 ▎ ^| ▎◆
>>ms.txt echo           ^|^| ^&^&▎   ▎       ▎'^|'▎ o
>>ms.txt echo           ^|^| ##■■■■■■■■■■〓
msg %username% /w /time:3600 <ms.txt
del ms.txt
pause

执行即可:

四、mshta

@echo off
echo 做好准备,响了啊!!
pause

cls
call :voice
echo 怎么样?呵呵,刺激吧~
pause&goto:eof

:voice
mshta vbscript:createobject("sapi.spvoice").speak("Merry Christmas and Happy New Year!")(window.close)
pause
goto:eof

结束控制:

–1、暂停批处理:直接按键盘上的Pause键喽
–2、终止批处理:组合键Ctrl+C。不过,有时候它好像响应的不太积极啊

参考的mshta命令用法示例:

参考原文章地址
防止内容丢失,我把作者的内容复制过来了,欢迎去看原博主写的。
JS:
复制代码代码如下:

mshta vbscript:window.execScript("alert('hello world!');","javascript") 

VBS:

复制代码代码如下:

mshta javascript:window.execScript("msgBox('hello world!'):window.close","vbs") 

调用VBS,分别使用MSGBOX函数和POPUP方法:

复制代码代码如下:

mshta vbscript:msgbox("该干活了,伙计!",64,"提示")(window.close) 
mshta vbscript:CreateObject("Wscript.Shell").popup("该干活了,伙计!",7,"提示",64)(window.close) 

execute方法 一条语句连续弹二个信息框:

复制代码代码如下:

mshta vbscript:execute("msgbox ""one BOX"":msgbox ""two BOX"":window.close") 

LZ他们弄的,调用系统的英文阅读:

复制代码代码如下:

mshta vbscript:createobject("sapi.spvoice").speak("Good luck")(window.close) 

五、ASCII码

ASCII码是图形化的符号,可以用来点缀我们的批处理的。
在cmd窗口中我们可以通过任意一个字符的ASCII码来输入该字符,比如Ctrl+G、Ctrl+N等,字母a-z对应ASCII码的1-26。对于ASCII码大于26的字符,可以通过这个方法来输入:按住Alt键不松,通过小键盘输入ASCII码的十进制值,松开Alt键即可

下面这个批处理,可以把一个文件中的字符的ASCII码遍历打出来。

@echo off&mode con cols=80
:begin
cls
set/p file=请输入要处理的文件(Q 键直接退出此脚本):
        if /i "%file%"=="Q" goto :eof
        if "%file%"=="" goto error
set new=%random%
for %%a in (%file%) do set size=%%~za
        if "%size%"=="0" goto error
cls&fsutil file createnew %new% %size% >nul
echo=&&echo=文件内容为为:&echo==========================================================
@type %file%
echo=&echo==========================================================&
echo=&&echo=文件内容所对应的ASCII码的十六进制形式依次为:&echo==========================================================
for /f "skip=1 tokens=3" %%a in ('fc /B %new% %file%') do (
        set /p=%%a <nul
)
echo=&echo==========================================================&echo=&echo=&echo=文件内容所对应的ASCII码的十进制形式依次为:&echo==========================================================
setlocal EnableDelayedExpansion
for /f "skip=1 tokens=3" %%a in ('fc /B %new% %file%') do (
        set num=%%a
        set /a num=0x!num!
        set /p=!num! <nul
)
del %new%
endlocal&echo;&echo==========================================================&echo;&pause
exit /b 0

:error
        cls&echo;&echo;
        echo         “输入错误” OR “文件大小为零”,请重新输入……
        del %new% >nul 2>nul
        set file=
        set new=
        pause>nul&goto :begin

执行效果:

window的dos命令学习笔记 七
window的dos命令学习笔记 七

window的dos命令学习笔记 七
window的dos命令学习笔记 七

六、一些杂点:

发现之前的学习过的知识点中还有一些比较实用的地方,但是之前没有注意到,再来补充补充。当然还有一些没有讲过的。

1、@符合的另一个用法:

之前学习了for的时候,发现后面可以跟上@和一些批处理命令。然后我想到了,如果和我之前的成绩分类的call用@替代,是否可以?

然后我测试了下。
之前的写法:

@echo off
:return1
set score=
set /p score=请输入成绩
rem 用来判断是否格式正确
if %score% LSS 0 (
echo "输入的成绩分数不对:%score%(分数0-100之间),请再次输入:" 
goto return1
) 
if %score% GTR 100 (
echo "输入的成绩分数不对:%score%(分数0-100之间),请再次输入:" 
goto return1
) 
if %score% GTR 90 (
echo "优秀" 
call pause
call exit
)

if %score% GTR 80 (
echo "良好" 
call pause
call exit
)

if %score% GTR 70 (
echo "中等" 
pause
call exit
)

if %score% GTR 60 (
echo "及格" 
call pause
call exit
)
if (%score% LSS 60) (
echo "不及格" 
call pause
call exit
)

用@替代call:之前写这一点特别印象深刻,为了实现输入数字之后,直接将输出分类并且停顿然后退出,我当时搞了好久才弄成功这个效果。

@echo off
:return1
set score=
set /p score=请输入成绩
rem 用来判断是否格式正确
if %score% LSS 0 (
echo "输入的成绩分数不对:%score%(分数0-100之间),请再次输入:" 
goto return1
) 
if %score% GTR 100 (
@echo "输入的成绩分数不对:%score%(分数0-100之间),请再次输入:" 
@goto return1
) 
if %score% GTR 90 (
echo "优秀" 
@pause
@exit
)

if %score% GTR 80 (
echo "良好" 
@pause
@exit
)

if %score% GTR 70 (
echo "中等" 
@pause
@exit
)

if %score% GTR 60 (
echo "及格" 
@pause
@exit
)
if (%score% LSS 60) (
echo "不及格" 
@pause
@exit
)

效果和之前的一样,说明除了我之前的call,使用@符合也是可以的。
window的dos命令学习笔记 七
使用&也可以达到之前的效果:

@echo off
:return1
set score=
set /p score=请输入成绩
rem 用来判断是否格式正确
if %score% LSS 0 (
echo "输入的成绩分数不对:%score%(分数0-100之间),请再次输入:" 
goto return1
) 
if %score% GTR 100 (
@echo "输入的成绩分数不对:%score%(分数0-100之间),请再次输入:" 
@goto return1
) 
if %score% GTR 90 (
echo "优秀" &pause&exit
)

if %score% GTR 80 (
echo "良好" &pause&exit
)

if %score% GTR 70 (
echo "中等" &pause&exit
)

if %score% GTR 60 (
echo "及格" &pause&exit
)
if (%score% LSS 60) (
echo "不及格" &pause&exit
)

@总结:

我们之前只知道echo off关闭回显,加入@之后,命令也会显示,只显示@后面名称处理的结果,显示结合我这个成绩分类,能达到和call的效果。

2、TITLE(标题)

设置cmd窗口的标题

比如:

@Echo off
title 这是一个title
pause

点击运行之后:

window的dos命令学习笔记 七

3、find(查找)

E:\000dos\7笔记七>find /?
在文件中搜索字符串。

FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]

  /V         显示所有未包含指定字符串的行。
  /C         仅显示包含字符串的行数。
  /N         显示行号。
  /I         搜索字符串时忽略大小写。
  /OFF[LINE] 不要跳过具有脱机属性集的文件。
  "string" 指定要搜索的文本字符串。
  [drive:][path]filename
             指定要搜索的文件。

如果没有指定路径,FIND 将搜索在提示符处键入
的文本或者由另一命令产生的文本。

①、/V参数(可以理解为反选,和shell的grep -v功能类似)

window的dos命令学习笔记 七

②、不带参数:

不带参数就是查找含有字符串的行
window的dos命令学习笔记 七

③、/C只显示含有匹配到的字符串的行数

window的dos命令学习笔记 七

④、/i,不区分大小写

window的dos命令学习笔记 七

4、cd /d

之前我一直好奇为什么我在cmd中直接切换到e盘或者D盘就是不成功,但是在linux中确实可以随便切换的,然后我就好奇,试试,偶然发现带上/d参数就可以了。

E:\000dos\7笔记七>cd /?
显示当前目录名或改变当前目录。

CHDIR [/D] [drive:][path]
CHDIR [..]
CD [/D] [drive:][path]
CD [..]

  ..   指定要改成父目录。

键入 CD drive: 显示指定驱动器中的当前目录。
不带参数只键入 CD,则显示当前驱动器和目录。

使用 /D 开关,除了改变驱动器的当前目录之外,
还可改变当前驱动器。

如果命令扩展被启用,CHDIR 会如下改变:

当前的目录字符串会被转换成使用磁盘名上的大小写。所以,
如果磁盘上的大小写如此,CD C:\TEMP 会将当前目录设为
C:\Temp。

CHDIR 命令不把空格当作分隔符,因此有可能将目录名改为一个
带有空格但不带有引号的子目录名。例如:

     cd \winnt\profiles\username\programs\start menu

与下列相同:

     cd "\winnt\profiles\username\programs\start menu"

在扩展停用的情况下,你必须键入以上命令。

比如我的切换效果:
window的dos命令学习笔记 七
从上面的效果来看,不带/d的时候,在自己盘符可以随便切换目录,但如果想跳转盘符确实需要加上/d就可以了,这点和shell有区别,不过可能因为Linux没有这个盘符区分的原因吧。

还有一点,只有cd时,返回的就是当前目录地址,就和shell的pwd的功能。
window的dos命令学习笔记 七

5、pushd 和 popd

pushd:保存当前的目录
popd:回到刚刚pushd的保存的目录。

window的dos命令学习笔记 七

相关标签: dos命令