window的dos命令学习笔记 七
文章目录
一、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
执行结果:
将需要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"
在亮白色上产生淡红色
2、mode
cols即宽度,lines即高度。
mode con cols=50 lines=20
执行之后窗口自动变小了。
、
再次输入mode,不加任何参数:即显示状态信息。
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
执行效果:
六、一些杂点:
发现之前的学习过的知识点中还有一些比较实用的地方,但是之前没有注意到,再来补充补充。当然还有一些没有讲过的。
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,使用@符合也是可以的。
使用&也可以达到之前的效果:
@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
点击运行之后:
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功能类似)
②、不带参数:
不带参数就是查找含有字符串的行
③、/C
只显示含有匹配到的字符串的行数
④、/i
,不区分大小写
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"
在扩展停用的情况下,你必须键入以上命令。
比如我的切换效果:
从上面的效果来看,不带/d的时候,在自己盘符可以随便切换目录,但如果想跳转盘符确实需要加上/d就可以了,这点和shell有区别,不过可能因为Linux没有这个盘符区分的原因吧。
还有一点,只有cd时,返回的就是当前目录地址,就和shell的pwd的功能。
5、pushd 和 popd
pushd:保存当前的目录
popd:回到刚刚pushd的保存的目录。
上一篇: php 进行 HTTP 认证
推荐阅读
-
Laravel学习笔记之Artisan命令生成自定义模板的方法
-
JS学习笔记:JS 的function( window, undefined ) {}(window)写法
-
Laravel学习笔记之Artisan命令生成自定义模板的方法
-
解决PHP在DOS命令行下却无法链接MySQL的技术笔记
-
Java学习笔记七:Java的流程控制语句之switch
-
Kafka学习笔记(五):kafka的常用命令及工具KafkaTool学习
-
Django基础与使用命令创建Django的过程(Django学习笔记)
-
Python学习笔记(七)—Python中is和==(is not和!=)的区别
-
Linux学习笔记(三)目录和文件都能操作的命令
-
webrtc学习笔记七(datachannel在jslinux的应用,nodejs版本)