python3呼叫windows dos命令
最近遊戲專案在多個國家上線,每個國家都對應兩份兒svn目錄(一份是本地策劃目錄,一份是線上目錄)。於是乎維護變得很煩躁。需要先更新本地策劃svn目錄,然後把更新的檔案拷貝到對應的線上目錄,然後提交線上svn目錄,然後維護伺服器。多個國家就要重複多次類似的更新,拷貝,提交的操作,還要格外注意不能手抖,出現少複製的錯誤。這種重複的操作很適合寫一個工具來完成。
於是考慮使用python來寫這個工具,最基本的操作就是使用python呼叫svn命令。因為windows安裝svn後是沒有svn命令列的,所以首先需要下載Apache-Subversion,這是svn命令列工具,解壓後設置環境變數。
python呼叫dos命令,使用下面的方法:
os.popen(command)
此方法會阻塞,直到執行完成,當然也會返回執行的結果。如果你使用chcp設定過windows命令列的內碼表,比如曾經使用:chcp 65001。那麼在執行python程式的時候就可能產生gbk編碼的錯誤,解決此問題需要重新使用:chcp 936來設定命令列內碼表就OK了。
完整程式碼如下:
import os
import shutil
'''
迴圈執行每個一個資源目錄,每個目錄的執行過程如下:
1:更新線上目錄
2:更新本地目錄
3:把本地目錄的修改同步到線上目錄
4:提交線上目錄
'''
#本地svn目錄
local_r_en = "server/trunk/resource"
local_r_ar = "server/resource_ar"
local_r_fr = "server/resource_fr"
local_r_ge = "server/resource_ge"
local_r_ita = "server/resource_ita"
local_r_ru = "server/resource_ru"
local_r_sp = "server/resource_sp"
local_r_tr = "server/resource_tr"
local_r_wp_en = "server/resource_wp"
#線上svn目錄
online_r_en = "serverOL/resource_en"
online_r_ar = "serverOL/resource_ar"
online_r_fr = "serverOL/resource_fr"
online_r_ge = "serverOL/resource_ge"
online_r_ita = "serverOL/resource_ita"
online_r_ru = "serverOL/resource_ru"
online_r_sp = "serverOL/resource_sp"
online_r_tk = "serverOL/resource_tk"
online_r_wp_en = "serverOL/resource_wp"
#不需要更新的伺服器,請把下面對應的資源目錄註釋掉
recource_dict = {}
recource_dict[local_r_en] = online_r_en #美國
# recource_dict[local_r_ar] = online_r_ar #阿拉伯
# recource_dict[local_r_fr] = online_r_fr #法國
# recource_dict[local_r_ge] = online_r_ge #德國
# recource_dict[local_r_ita] = online_r_ita #義大利
# recource_dict[local_r_ru] = online_r_ru #俄羅斯
# recource_dict[local_r_sp] = online_r_sp #西班牙
# recource_dict[local_r_tr] = online_r_tk #土耳其
# recource_dict[local_r_wp] = online_r_wp #wp
'''
複製檔案到目的檔案
'''
def copyFile(src,dst):
#目的目錄
dst_dir = dst[:dst.rfind("/")]
#如果目錄不存在則建立目錄,如果檔案存在則刪除
if not os.path.exists(dst_dir):
os.makedirs(dst_dir)
elif os.path.exists(dst):
os.remove(dst)
#複製新檔案
shutil.copyfile(src, dst)
#end method copyFile
'''
刪除檔案
'''
def removeFile(dst):
if os.path.exists(dst):
os.remove(dst)
#end method removeFile
'''
列印命令結果
'''
def svnResult(result):
for line in result:
line = line.replace("\n","")
print(line)
#end method svnResult
'''
svn命令執行
'''
def svnSimpleExecute(command):
print(">>",command)
result = os.popen(command).readlines()
svnResult(result)
#end method svnExecute
'''
svn提交目錄
'''
def svnCommit(dst):
command = "svn status "+dst
print(">>",command)
command_result = os.popen(command).readlines()
if len(command_result) <= 2:
print("沒有需要新增,刪除和提交的內容")
return
for line in command_result:
#去掉換行符
line = line.replace("\n","")
print(line)
line = line.replace(" ","")
firstChar = line[0:1]
filePath = line[1:]
#命令
command_add = "svn add "+filePath
command_ci = "svn commit -m \"svn tools commit,更新維護。\" "+filePath
command_rm = "svn delete "+filePath
if firstChar == "?":#ADD命令
svnSimpleExecute(command_add)
svnSimpleExecute(command_ci)
elif firstChar in "ADM":#COMMIT 命令
svnSimpleExecute(command_ci)
elif firstChar == "!": #刪除命令
svnSimpleExecute(command_rm)
svnSimpleExecute(command_ci)
else:
print("Unkonw.......",line)
#end method svnCommit
'''
解析獲得對應的本地檔案和線上檔案路徑
'''
def parseLine(line,local_dir,online_dir):
line = line.replace("'","")
line = line.replace("\\","/")
line = line.replace(local_dir,"")
pos = line.find("/")
return local_dir + line[pos:],online_dir + line[pos:]
#end method parseLine
#迴圈資源目錄
for local_dir in recource_dict:
online_dir = recource_dict[local_dir]
#更新線上資源
command_online = "svn up " + online_dir
svnSimpleExecute(command_online)
#更新本地資源
command_local = "svn up " + local_dir
print(">>",command_local)
lines = os.popen(command_local).readlines()
if len(lines) <= 2:
print("沒有更新內容")
continue
#去掉頭和尾部內容
lines.pop(-1)
lines.pop(0)
for line in lines:
#去掉換行符
line = line.replace("\n","")
print(line)
#解析檔案對應目錄
localFilePath,onlineFilePath = parseLine(line,local_dir,online_dir)
if line.startswith("Restored") or line.startswith("A") or line.startswith("U"):
print("複製檔案:",localFilePath,"到",onlineFilePath)
copyFile(localFilePath,onlineFilePath)
elif line.startswith("D"):
#刪除
print("刪除檔案:",onlineFilePath)
removeFile(onlineFilePath)
#提交線上目錄
svnCommit(online_dir)
這下維護起來就簡單多了,世界瞬間清淨了。
相關推薦
python3呼叫windows dos命令
最近遊戲專案在多個國家上線,每個國家都對應兩份兒svn目錄(一份是本地策劃目錄,一份是線上目錄)。於是乎維護變得很煩躁。需要先更新本地策劃svn目錄,然後把更新的檔案拷貝到對應的線上目錄,然後提交線上svn目錄,然後維護伺服器。多個國家就要重複多次類似的更新,拷
windows dos命令配置JAVA環境變數
配置JAVA系統(不是使用者)環境變數 ::新增環境變數JAVA_HOME ::echo off 表示在批處理檔案執行過程中,只顯示結果,而不顯示執行的命令 @echo on echo 新增Java環境變數 setx /M JAVA_HOME "D:\workspaces
Java呼叫Windows系統命令CMD
Java的Runtime.getRuntime().exec(commandStr)可以呼叫執行cmd指令。 cmd /c dir 是執行完dir命令後關閉命令視窗。 cmd /k dir 是執行完dir命令後不關閉命令視窗。 cmd /c start dir 會開啟一
Python呼叫Windows CMD命令刪除檔案異常分析與解決
Windows下偶爾需要用到使用Python呼叫系統中的命令處理某些東西,在處理檔案的時候偶爾會遇到問題。問題基本上都會與Windows的CMD命令使用有關,而我對這個不是很熟悉。剛剛嘗
Windows系統下八大具有高逼格的DOS命令之一【ping】
手動 時間 tro ping命令 數據表 攻擊 基礎 我們 原理 ping命令: ping是用來檢測網絡是否通暢或者查詢網絡連接速度的一個基礎命令。作為一名對計算機癡迷的愛好者來說,ping命令是需要第一個掌握的DOS命令。它所利用的原理是這樣的:網絡上的機器都有唯一確定的
java----調用windows的DOS命令並回顯/啟動和關閉appium
學習記錄/** * Java調用windows的DOS命令 * 實現調用Windows的ipconfig命令,然後將輸出的信息通過IO流輸出到控制臺。 * 實現啟動appium服務 * 實現關閉appium服務 */ public class Doc { public static
windows dos 常用命令行
tfs details 配置 共享 disk div 文件和目錄 tab AI 有關某個命令的詳細信息,請鍵入 HELP 命令名 dir (directory) :列出當前目錄下的文件以及文件夾 md (make directory): 創建目錄 rd (remove di
java通過telnet遠程至windows機器執行dos命令
功能說明 用戶名 time ted clas cte flag author enc 準備工作,遠程windows機器中開啟telnet服務,將遠程登錄用戶添加至telnetClients用戶組 核心代碼: import java.io.IOException; impor
Windows的DOS命令基礎
his 刪除 常見 ipv mdi 網絡 當前 鍵盤 cmd命令行 什麽是DOS命令 DOS命令,計算機術語,是指DOS操作系統的命令,是一種面向磁盤的操作命令,主要包括目錄操作類命令、磁盤操作類命令、文件操作類命令和其它命令。 調出運行對話框:Win+R快捷鍵 打開命名
Windows基礎——常用的DOS命令
整理一些Windows的DOS命令,防止以後忘記! mkdir/md test 建立一個名稱為test的目錄 rd test 刪除一個名稱為test的目錄 ipconfig /release 釋放IP地址 ipconfi
windows dos 常用命令列(完整)
dir (directory) :列出當前目錄下的檔案以及資料夾 md (make directory): 建立目錄 rd (remove directory):刪除目錄 cd (change directory):進入指定目錄 cd… : 退回到上一級目錄 cd\ : 退回到根目錄 del
windows環境下安裝mysql 8.0.13在dos命令中的安裝問題
mysql下載地址https://dev.mysql.com/downloads/mysql/ 我下載的是最新的 本文是針對安裝中遇到的小問題進行小結: 一、配置好PATH路徑,環境變數中設定:(\bin路徑) 在PATH中新增路徑 二、進入命令列控制,記住使用管
windows中dos命令指南
CMD命令:開始->執行->鍵入cmd或command(在命令列裡可以看到系統版本、檔案系統版本)chcp 修改預設字符集chcp 936預設中文chcp 650011. appwiz.cpl:程式和功能 2. calc:啟動計算器 5. chkdsk.exe:Chkdsk磁碟檢查(管理員身份執
Windows下DOS命令大全(經典收藏)
copy \\ip\admin$\svv.exe c:\ 或:copy\\ip\admin$\*.* 複製對方admini$共享下的srv.exe檔案(所有檔案)至本地C: xcopy 要複製的檔案或目錄樹 目標地址\目錄名 複製檔案和目錄樹,用引數/Y將不提示覆蓋相同檔案 
Windows下打包maven專案,編寫bat指令碼,dos命令在後臺執行與關閉
在IDEA終端 mvn clean package 會在專案目錄下建立一個target目錄,打好包的jar包就在這個目錄下。 那麼如何執行? 首先編寫bat檔案,如下編寫 eureka_run.bat @echo off start jav
Windows下用DOS命令subst把一個目錄變為一個磁碟驅動器
subst,DOS命令,用於路徑替換 ,將路徑與驅動器號關聯,就是把一個目錄當作一個磁碟驅動器來看,不過不能格式化。運用一定技巧,subst命令還可以實現隱藏驅動器、特殊軟體的安裝、模擬光碟自動執行
關於windows下批處理指令碼和dos命令
@echo off @title 字串的編輯測試(下面描述用的箭頭→ ← 分別表示向右、向左的意思) set aa=1234567890 echo 說明:下面複合變數中,逗號前的數字表示指標偏移量,逗號後的數字表示提取的字元長度 echo %aa:~1,5% //指標向右→偏移1位,然後從指標處開始向右→提取
【Windows DOS】如何複製命令提示符視窗的內容?
有人選擇好複製區域後發現,【Ctrl+C】這個複製命令時好時不好,其實Dos視窗或者控制檯視窗的複製命令不是【Ctrl+C】,其實是鍵盤“Enter”鍵或滑鼠“右鍵”。 其實只要,使用滑鼠“標記(K)
windows下命令列呼叫R指令碼
1、將R.exe所在路徑加到環境變數path下,路徑一般為C:\Program Files\R\R-3.0.1\bin 2、在windows 命令列中敲入 呼叫命令:r CMD BATCH D:\RWORKSPACE\CMD_TEST.R (注意 CMD BATCH 都要
Windows DOS內部命令詳解03——path、type、copy
前言 繼上會書說道Windows DOS內部命令中的命令格式和dir、cd、mkdir、rd,今天我們繼續來戰。 path命令 MS-DOS命令的格式是以<命令動詞>開始,而外部命令的<命令動詞>是一個磁碟檔案的檔名。如果想要執行的