我們經常在C/C++中用“system("pause");”作暫停陳述句外,還有很多可以用system()呼叫,比如以下這些dos命令的功能也很不錯:
system("title C++顏色設定程式"); //設定控制臺視窗的標題,即cmd.exe的標題
system("mode con cols=64 lines=25"); //設定視窗寬度高度
system("date /t"); //顯示日期
system("time /t"); //顯示時間
system("shutdown -s -t 3600"); //延時關機 3600秒即一小時后關機
system("shutdown -a"); //取消延時關機
system("color 0B"); //設定文本和背景顏色
核心就用system()函式呼叫windows作業系統的DOS命令來做點事情,iOS、linux系統中也一樣,僅需把引號中的命令列字串換成對應作業系統的命令即可,
Python語言中,os庫的system()函式同樣也是這個功能,舉個例子:
>>> import os
>>> for _ in range(5):
t = os.system('echo ·')
>>> t
0
>>>
以上代碼可以發出5次蜂鳴聲,這個實質就是ascii字符7(beep)的顯示,它在Python IDLE視窗中呈現為“echo ·”中的那個粗圓點,可以用alt鍵+小鍵盤上的007鍵入;在DOS視窗下的python中除了這個方法還能用“Ctrl+G”錄入,呈現為“echo ^G”,
代碼運行結束后,t 就接受了echo命令的回傳值,DOS命令執行成功一般都回傳 0 ,
同樣換個DOS命令“Date /t”來顯示日期:
>>> import os
>>> os.system('Date /t')
0
>>>
同樣,也只回傳一個 0 ,沒有見到日期顯示,但在控制臺視窗下是可以顯示的:

time 命令也一樣,另外這兩個命令還能用“echo 環境變數”來實作,看上圖中陳述句回傳的兩行第一行顯示的是我們想獲取的值,第二行是命令回傳值,通過賦值只能得到這個回傳值 0 ,

題外話:DOS中用兩個%把環境變數名括起來表示一個環境變數, 可以用dos命令 set 來顯示和設定這些系統環境變數,除了用“set path”外,path 命令可以單獨顯示 %PATH% 變數,
從上圖中可以看到,用引號和波浪線 :~pos, length 可以把環境變數值按開始位置和所要長度來分割開,類似python的字串切片: str='2021-10-19'; str[0:4],
各個時期的Dos版本的內部命令有增有減個數不定,另外還有很多的外部命令可用,

D:\>set os
OS=Windows_NT
D:\>set systemdrive
SystemDrive=C:
D:\>set windir
windir=C:\Windows
D:\>set path
Path=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;D:\Python\Scripts\;D:\Python\
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
D:\>set pathext
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
D:\>path
PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;D:\Python\Scripts\;D:\Python\
D:\>ver
Microsoft Windows [版本 6.1.7601]
D:\>
列出當前DOS版本的所有內部命令:
>>> import os
>>> print(''.join(os.popen('help').readlines()[2:-3]))
ATTRIB 顯示或更改檔案屬性,
BREAK 設定或清除擴展式 CTRL+C 檢查,
BCDEDIT 設定啟動資料庫中的屬性以控制啟動加載,
CACLS 顯示或修改檔案的訪問控制串列(ACL),
CALL 從另一個批處理程式呼叫這一個,
CD 顯示當前目錄的名稱或將其更改,
CHCP 顯示或設定活動代碼頁數,
CHDIR 顯示當前目錄的名稱或將其更改,
CHKDSK 檢查磁盤并顯示狀態報告,
CHKNTFS 顯示或修改啟動時間磁盤檢查,
CLS 清除螢屏,
CMD 打開另一個 Windows 命令解釋程式視窗,
COLOR 設定默認控制臺前景和背景顏色,
COMP 比較兩個或兩套檔案的內容,
COMPACT 顯示或更改 NTFS 磁區上檔案的壓縮,
CONVERT 將 FAT 卷轉換成 NTFS,您不能轉換
當前驅動器,
COPY 將至少一個檔案復制到另一個位置,
DATE 顯示或設定日期,
DEL 洗掉至少一個檔案,
DIR 顯示一個目錄中的檔案和子目錄,
DISKCOMP 比較兩個軟盤的內容,
DISKCOPY 將一個軟盤的內容復制到另一個軟盤,
DISKPART 顯示或配置磁盤磁區屬性,
DOSKEY 編輯命令列、呼叫 Windows 命令并創建宏,
DRIVERQUERY 顯示當前設備驅動程式狀態和屬性,
ECHO 顯示訊息,或將命令回顯打開或關上,
ENDLOCAL 結束批檔案中環境更改的本地化,
ERASE 洗掉一個或多個檔案,
EXIT 退出 CMD.EXE 程式(命令解釋程式),
FC 比較兩個檔案或兩個檔案集并顯示它們之間的不同,
FIND 在一個或多個檔案中搜索一個文本字串,
FINDSTR 在多個檔案中搜索字串,
FOR 為一套檔案中的每個檔案運行一個指定的命令,
FORMAT 格式化磁盤,以便跟 Windows 使用,
FSUTIL 顯示或組態檔系統的屬性,
FTYPE 顯示或修改用在檔案擴展名關聯的檔案型別,
GOTO 將 Windows 命令解釋程式指向批處理程式
中某個帶標簽的行,
GPRESULT 顯示機器或用戶的組策略資訊,
GRAFTABL 啟用 Windows 在圖形模式顯示擴展字符集,
HELP 提供 Windows 命令的幫助資訊,
ICACLS 顯示、修改、備份或還原檔案和
目錄的 ACL,
IF 在批處理程式中執行有條件的處理程序,
LABEL 創建、更改或洗掉磁盤的卷標,
MD 創建一個目錄,
MKDIR 創建一個目錄,
MKLINK 創建符號鏈接和硬鏈接
MODE 配置系統設備,
MORE 逐屏顯示輸出,
MOVE 將一個或多個檔案從一個目錄移動到另一個目錄,
OPENFILES 顯示遠程用戶為了檔案共享而打開的檔案,
PATH 為可執行檔案顯示或設定搜索路徑,
PAUSE 停止批處理檔案的處理并顯示資訊,
POPD 還原由 PUSHD 保存的當前目錄上一次的值,
PRINT 列印一個文本檔案,
PROMPT 改變 Windows 命令提示,
PUSHD 保存當前目錄,然后對其進行更改,
RD 洗掉目錄,
RECOVER 從損壞的磁盤中恢復可讀取的資訊,
REM 記錄批處理檔案或 CONFIG.SYS 中的注釋,
REN 重新命名檔案,
RENAME 重新命名檔案,
REPLACE 替換檔案,
RMDIR 洗掉目錄,
ROBOCOPY 復制檔案和目錄樹的高級實用程式
SET 顯示、設定或洗掉 Windows 環境變數,
SETLOCAL 開始用批檔案改變環境的本地化,
SC 顯示或配置服務(后臺處理),
SCHTASKS 安排命令和程式在一部計算機上按計劃運行,
SHIFT 調整批處理檔案中可替換引數的位置,
SHUTDOWN 讓機器在本地或遠程正確關閉,
SORT 將輸入排序,
START 打開單獨視窗運行指定程式或命令,
SUBST 將驅動器號與路徑關聯,
SYSTEMINFO 顯示機器的具體的屬性和配置,
TASKLIST 顯示包括服務的所有當前運行的任務,
TASKKILL 終止正在運行的行程或應用程式,
TIME 顯示或設定系統時間,
TITLE 設定 CMD.EXE 會話的視窗標題,
TREE 以圖形顯示啟動器或路徑的目錄結構,
TYPE 顯示文本檔案的內容,
VER 顯示 Windows 的版本,
VERIFY 告訴 Windows 驗證檔案是否正確寫入磁盤,
VOL 顯示磁盤卷標和序列號,
XCOPY 復制檔案和目錄樹,
>>> print(''.join(os.popen('help').readlines()[1:-2]))
ASSOC 顯示或修改檔案擴展名關聯,
ATTRIB 顯示或更改檔案屬性,
BREAK 設定或清除擴展式 CTRL+C 檢查,
BCDEDIT 設定啟動資料庫中的屬性以控制啟動加載,
CACLS 顯示或修改檔案的訪問控制串列(ACL),
CALL 從另一個批處理程式呼叫這一個,
CD 顯示當前目錄的名稱或將其更改,
CHCP 顯示或設定活動代碼頁數,
CHDIR 顯示當前目錄的名稱或將其更改,
CHKDSK 檢查磁盤并顯示狀態報告,
CHKNTFS 顯示或修改啟動時間磁盤檢查,
CLS 清除螢屏,
CMD 打開另一個 Windows 命令解釋程式視窗,
COLOR 設定默認控制臺前景和背景顏色,
COMP 比較兩個或兩套檔案的內容,
COMPACT 顯示或更改 NTFS 磁區上檔案的壓縮,
CONVERT 將 FAT 卷轉換成 NTFS,您不能轉換
當前驅動器,
COPY 將至少一個檔案復制到另一個位置,
DATE 顯示或設定日期,
DEL 洗掉至少一個檔案,
DIR 顯示一個目錄中的檔案和子目錄,
DISKCOMP 比較兩個軟盤的內容,
DISKCOPY 將一個軟盤的內容復制到另一個軟盤,
DISKPART 顯示或配置磁盤磁區屬性,
DOSKEY 編輯命令列、呼叫 Windows 命令并創建宏,
DRIVERQUERY 顯示當前設備驅動程式狀態和屬性,
ECHO 顯示訊息,或將命令回顯打開或關上,
ENDLOCAL 結束批檔案中環境更改的本地化,
ERASE 洗掉一個或多個檔案,
EXIT 退出 CMD.EXE 程式(命令解釋程式),
FC 比較兩個檔案或兩個檔案集并顯示它們之間的不同,
FIND 在一個或多個檔案中搜索一個文本字串,
FINDSTR 在多個檔案中搜索字串,
FOR 為一套檔案中的每個檔案運行一個指定的命令,
FORMAT 格式化磁盤,以便跟 Windows 使用,
FSUTIL 顯示或組態檔系統的屬性,
FTYPE 顯示或修改用在檔案擴展名關聯的檔案型別,
GOTO 將 Windows 命令解釋程式指向批處理程式
中某個帶標簽的行,
GPRESULT 顯示機器或用戶的組策略資訊,
GRAFTABL 啟用 Windows 在圖形模式顯示擴展字符集,
HELP 提供 Windows 命令的幫助資訊,
ICACLS 顯示、修改、備份或還原檔案和
目錄的 ACL,
IF 在批處理程式中執行有條件的處理程序,
LABEL 創建、更改或洗掉磁盤的卷標,
MD 創建一個目錄,
MKDIR 創建一個目錄,
MKLINK 創建符號鏈接和硬鏈接
MODE 配置系統設備,
MORE 逐屏顯示輸出,
MOVE 將一個或多個檔案從一個目錄移動到另一個目錄,
OPENFILES 顯示遠程用戶為了檔案共享而打開的檔案,
PATH 為可執行檔案顯示或設定搜索路徑,
PAUSE 停止批處理檔案的處理并顯示資訊,
POPD 還原由 PUSHD 保存的當前目錄上一次的值,
PRINT 列印一個文本檔案,
PROMPT 改變 Windows 命令提示,
PUSHD 保存當前目錄,然后對其進行更改,
RD 洗掉目錄,
RECOVER 從損壞的磁盤中恢復可讀取的資訊,
REM 記錄批處理檔案或 CONFIG.SYS 中的注釋,
REN 重新命名檔案,
RENAME 重新命名檔案,
REPLACE 替換檔案,
RMDIR 洗掉目錄,
ROBOCOPY 復制檔案和目錄樹的高級實用程式
SET 顯示、設定或洗掉 Windows 環境變數,
SETLOCAL 開始用批檔案改變環境的本地化,
SC 顯示或配置服務(后臺處理),
SCHTASKS 安排命令和程式在一部計算機上按計劃運行,
SHIFT 調整批處理檔案中可替換引數的位置,
SHUTDOWN 讓機器在本地或遠程正確關閉,
SORT 將輸入排序,
START 打開單獨視窗運行指定程式或命令,
SUBST 將驅動器號與路徑關聯,
SYSTEMINFO 顯示機器的具體的屬性和配置,
TASKLIST 顯示包括服務的所有當前運行的任務,
TASKKILL 終止正在運行的行程或應用程式,
TIME 顯示或設定系統時間,
TITLE 設定 CMD.EXE 會話的視窗標題,
TREE 以圖形顯示啟動器或路徑的目錄結構,
TYPE 顯示文本檔案的內容,
VER 顯示 Windows 的版本,
VERIFY 告訴 Windows 驗證檔案是否正確寫入磁盤,
VOL 顯示磁盤卷標和序列號,
XCOPY 復制檔案和目錄樹,
WMIC 在互動命令外殼里顯示 WMI 資訊,
回到正題,發個小秘技:
怎樣才能獲取dos命令顯示的內容而不是回傳值?
這要請出os庫的另一個函式 popen() ,和fopen讀取檔案差不多,也用readlines()讀取出資訊的每一行;每一行都是一個以'\n'結尾的字串元素,保存在同一個串列里,基本用法如下:
>>> import os
>>> os.popen('date /t')
<os._wrap_close object at 0x0000000002C82580>
>>> #一定要加上readlines()方法:
>>> os.popen('date /t').readlines()
['2021/10/19 周二 \n']
>>> os.popen('set path').readlines()
['PATH=C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;
C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;
D:\\Python\\Scripts\\;
D:\\Python\\\n',
'PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC\n']
>>>
自定義幾個能抓取DOS命令回傳資訊的函式:
>>> import os
>>> def Date():
command = 'echo %date:~0,4%年%date:~5,2%月%date:~8,2%日'
return os.popen(command).readlines()[0][:-1]
>>> Date()
'2021年10月19日'
>>>
>>> def Weekday():
command = 'echo 星期%date:~-1%'
return os.popen(command).readlines()[0][:-1]
>>> Weekday()
'星期二'
>>>
>>> def Time():
command = 'echo %time%'
return os.popen(command).readlines()[0][:8]
>>> Time()
'13:39:03'
>>>
>>> import os
>>> def Dir(Drive):
command = 'dir ' + Drive + ':'
dirlist = os.popen(command).readlines()
for d in dirlist:
print(d, end='')
print()
>>> Dir('C')
驅動器 C 中的卷是 C_HD
卷的序列號是 401B-F400
C:\ 的目錄
2021/10/14 09:55 17,783 2021年xxxxxxxxx總結10.18.xlsx
2021/10/12 10:54 <DIR> Program Files
2021/10/12 10:54 <DIR> Program Files (x86)
2021/09/16 14:45 <DIR> temp
2021/03/18 15:42 <DIR> Users
2021/10/13 15:45 <DIR> Windows
2021/10/11 11:11 <DIR> XSBDownload
1 個檔案 17,783 位元組
6 個目錄 93,678,710,784 可用位元組
>>>
>>> def Path():
command = 'path'
dirlist = os.popen(command).readlines()
dirlist = dirlist[0][:-1].split(';')
for d in dirlist:
print(d)
print()
>>> Path()
PATH=C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
D:\Python\Scripts\
D:\Python\
>>>
dos命令還有很多很多,其中有實用資訊回傳的都可以用os.system.popen().readlines()來獲取,
一起學習交流 Python 的群二維碼:
http://qr01.cn/FHYKEa

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/330324.html
標籤:python
上一篇:【我奶奶都能看懂系列011】??python基礎語法——類,小學生也可以學!
下一篇:根據經緯度計算兩地之間的距離
