天天看點

Python對單個多個win機器磁盤、共享檔案夾操作

作者:雲中随心而記

解決在win機器22,445端口無法通路的前提下: 連接配接多個win機器磁盤映射或者通路共享檔案夾問題

方法一: 直接套用如下腳本

導入os和subprocess子產品。

1.使用subprocess.run執行net use指令檢視該映射是否存在。

2.如果存在,則使用subprocess.run執行net use /delete指令斷開該映射。

3.如果不存在,則執行net use指令映射該磁盤。

4.如果需要使用者名密碼,則要求使用者輸入,然後使用subprocess.run執行net use指令映射該磁盤。

import os
import subprocess

# 定義待檢查的磁盤映射清單
drive_mappings = [
    {"drive": "X:", "path": "\\\\127.0..0.1\\shared", "user": "", "password": ""},
    {"drive": "Y:", "path": "\\\\127.0..0.2\\shared", "user": "username", "password": None},
    {"drive": "Z:", "path": "\\\\127.0..0.3\\shared", "user": "", "password": ""}
]

# 周遊映射清單,對每個映射進行檢查和斷開操作
for mapping in drive_mappings:
    # 執行net use指令檢視該映射是否存在
    result = subprocess.run(["net", "use", mapping["drive"]], capture_output=True)
    
    # 如果存在,則執行net use /delete指令斷開該映射, 如果gbk列印結果有問題,建議用cp850
    if "OK" in result.stdout.decode("gbk"):
        os.system(f"net use {mapping['drive']} /delete /yes")
				print(f"斷開映射 {mapping['drive']}")
    # 如果不存在,則執行net use指令映射該磁盤
    else:
        # 判斷是否需要輸入使用者名密碼
        if mapping["user"]:
            password = input(f"請輸入 {mapping['drive']} 的密碼:")
            if password:
                mapping["password"] = password
            else:
                print("密碼不能為空!")
                continue
        
        # 執行net use指令映射磁盤
        if mapping["password"] is not None:
            print(f"映射 {mapping['drive']}")
            os.system(f"net use {mapping['drive']} {mapping['path']} /user:{mapping['user']} {mapping['password']}")
        else:
            print(f"映射 {mapping['drive']}")
            os.system(f"net use {mapping['drive']} {mapping['path']}")           

在這個示例中,每個映射都被表示成一個包含映射驅動器,網絡共享路徑,使用者名和密碼的字典。在周遊映射清單時,我們首先使用subprocess.run執行net use指令來檢查是否存在映射。如果映射存在,我們使用os.system執行net use /delete指令來斷開該映射。如果映射不存在,我們首先檢查映射是否需要使用者名和密碼。如果需要,我們提示使用者輸入密碼,然後再使用os.system執行net use指令來映射磁盤。如果不需要密碼,則直接使用os.system映射磁盤。

方法二: 調用封裝函數

将腳本實作封裝後,隻需要在MapDisk.yaml檔案中寫用例即可,此後執行Map_disk.py腳本即可實作win磁盤的一些映射操作

目錄介紹:

Python對單個多個win機器磁盤、共享檔案夾操作

腳本附上:

yaml填寫需要映射的磁盤 和 共享路徑即可 使用者名密碼有則填寫,無則忽略

MapDisk.yaml 填寫用例

MapDisk:
  -
    dirver_disk: "W:"
    map_path: \\127.0.0.1\d$
    user:
    password:

  -
    dirver_disk: "E:"
    map_path: \\127.0.0.2\d$
    user: uatadmin
    password: [email protected]           

PublicConfig.py腳本: 配置讀取資訊,友善調用

import os
from Public_Utils.util_yaml import YamlReader

class YamlPath:
    def __init__(self):
        current = os.path.abspath(__file__)
        self.base_dir = os.path.dirname(os.path.dirname(current))

    def get_disk_yaml_file(self):
        _config_path = self.base_dir + os.sep + "Public_Config\Public_yaml"
        self._config_file = _config_path + os.sep + "MapDisk.yaml"
        return self._config_file

    def get_win_yaml_file(self):
        _config_path = self.base_dir + os.sep + "Public_Config\Public_yaml"
        self._config_file = _config_path + os.sep + "Mapwins.yaml"
        return self._config_file


class ConfigYaml:
    def __init__(self):   #初始yaml讀取配置檔案
        self.disk_config = YamlReader(YamlPath().get_disk_yaml_file()).yaml_data()
        self.win_config = YamlReader(YamlPath().get_win_yaml_file()).yaml_data()

    def get_dirver_disk(self):
        return self.disk_config['MapDisk']

    def get_win_yaml(self):
        return self.win_config

if __name__ == '__main__':
    #print(ConfigYaml().get_win_yaml())
    pass           

Map_disk.py 用例執行腳本

class MAPPing:
    #定義檢查映射磁盤的清單
    # ConfigYaml().get_dirver_disk()
    def Maps_disk(self):
        #周遊映射清單,對每個映射進行檢查和斷開操作
        for map_didk in ConfigYaml().get_dirver_disk():
            if map_didk['dirver_disk'] in subprocess.check_output("net use",shell=True).decode("cp850"): #執行net use指令檢視映射是否存在  -cp850
                os.system('net use %s /del /y' % map_didk['dirver_disk'])  # 删除映射盤
            if map_didk["user"] == None or map_didk["password"] ==None:
                os.system(f'net use {map_didk["dirver_disk"]} {map_didk["map_path"]}')
                print(f'成功映射驅動器{map_didk["dirver_disk"]} {map_didk["map_path"]}')
            else:
                os.system(f'net use {map_didk["dirver_disk"]} {map_didk["map_path"]} /user:{map_didk["user"]} {map_didk["password"]}')
                print(f'成功映射驅動器{map_didk["dirver_disk"]} {map_didk["map_path"]}')

if __name__ == '__main__':
    pass           

util_yaml.py

class YamlReader:
    #初始化,判斷檔案是否存在
    def __init__(self,yaml_file):
        if os.path.exists(yaml_file):
            self.yaml_file = yaml_file
        else:
            raise FileNotFoundError("yaml檔案不存在")
        self._data = None
        self._data_all = None

    def yaml_data(self):  #yaml檔案讀取 --單個文檔讀取
        #第一次調用data,讀取yaml文檔,如果不是,直接傳回之前儲存的資料
        if not self._data:
            with open(self.yaml_file,'rb') as f:
                self._data = yaml.safe_load(f)
        return self._data

    def yaml_data_all(self):  #多個文檔的讀取
        if not self._data_all:
            with open(self.yaml_file,'rb') as f:
                self._data_all = yaml.safe_load_all(f)
        return self._data_all