文章目錄
一、dos歷史學習筆記(後期整合到這裏,我想能學到這裏的應該不多了,嘿嘿,加油)
這個是我所以的dos學習筆記,希望對感興趣的你有所幫助,如有錯誤,還望不吝賜教。如果對你有幫助,希望給我點個贊哈,Thanks♪(・ω・)ノ
學習主要還是靠堅持,如果真的覺得學一個知識,就堅持下去;三天打魚倆天曬網,真的不如躺着歇,刷刷劇,或者玩倆局遊戲。。。
window的dos命令學習筆記 八— bat文件打包成exe程序(實現腳本加密)
二、執行狀態返回值(%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的保存的目錄。