我們這里有一個 powershell 腳本,收集一些用戶和 Windows 資訊,將它們存盤到 txt.file 中。
如果我可以選擇必須使用 wxGlade GUI 收集哪些資訊,那就太好了。
我已經有了一個如何執行 powershell 腳本的解決方案。
問題是我如何從 PowerShell 變數接收值到 Python 應用程式:
我們對這樣的 Powershell-Infos 感興趣:
$winver = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\" -Name
ReleaseID).ReleaseId
$OsName = Get-ComputerInfo OsName
$OsVersion = Get-ComputerInfo OsVersion
$OsBuildNumber = Get-ComputerInfo OsBuildNumber
$OsHardwareAbstractionLayer = Get-ComputerInfo OsHardwareAbstractionLayer
$OfficeVer = reg query "HKEY_CLASSES_ROOT\Word.Application\CurVer"
這是我用于測驗目的的(TKINTER)代碼。(從 Python 運行 PowerShell 腳本)我將使用一些高級 wxGlade-Widgets 升級它:
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox as tkmb
from tkinter import simpledialog as tksd
from tkinter import filedialog as tkfd
from pathlib import Path
from datetime import datetime
# First line
root = tk.Tk()
font_size = tk.IntVar(value=12)
# configure root
root.title('Powershell Test')
root.geometry('800x600 300 300')
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
root.configure(bg='#888')
import subprocess # IMPORT FOR SUB PROCESS . RUN METHOD
POWERSHELL_PATH = "C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\powershell.exe" #
POWERSHELL EXE PATH
ps_script_path =
"C:\\Users\\mr3968\\PycharmProjects\\SystemScriptWithGUI\\Powershell_Scripts\\browser.ps1" #
YOUR POWERSHELL FILE PATH
class Utility: # SHARED CLASS TO USE IN OUR PROJECT
@staticmethod # STATIC METHOD DEFINITION
def openbrowser(script_path, *params): # SCRIPT PATH = POWERSHELL SCRIPT PATH, PARAM =
POWERSHELL SCRIPT PARAMETERS ( IF ANY )
commandline_options = [POWERSHELL_PATH, '-ExecutionPolicy', 'Unrestricted',
ps_script_path] # ADD POWERSHELL EXE AND EXECUTION POLICY TO COMMAND VARIABLE
for param in params: # LOOP FOR EACH PARAMETER FROM ARRAY
commandline_options.append("'" param "'") # APPEND YOUR FOR POWERSHELL SCRIPT
process_result = subprocess.run(commandline_options, stdout = subprocess.PIPE, stderr
= subprocess.PIPE, universal_newlines = True) # CALL PROCESS
print(process_result.returncode) # PRINT RETURN CODE OF PROCESS 0 = SUCCESS, NON-
ZERO = FAIL
print(process_result.stdout) # PRINT STANDARD OUTPUT FROM POWERSHELL
print(process_result.stderr) # PRINT STANDARD ERROR FROM POWERSHELL ( IF ANY
OTHERWISE ITS NULL|NONE )
if process_result.returncode == 0: # COMPARING RESULT
Message = "Success !"
else:
Message = "Error Occurred !"
return Message # RETURN MESSAGE
powershell_frame = ttk.Frame(notebook)
notebook.add(powershell_frame, text='Powershell Test 1', underline=0)
powershell_frame.columnconfigure(2, weight=1)
powershell_frame.rowconfigure(1, weight=1)
# button open the browser
open_browser_btn = ttk.Button(
powershell_frame,
text='Open the browser'
)
open_browser_btn.grid(sticky=tk.E, ipadx=5, ipady=5)
open_browser_btn.configure(command=Utility.openbrowser(POWERSHELL_PATH))
root.mainloop()
以這種方式制作它是否有意義,還是使用本機 Python 代碼更容易收集所有這些資訊?
謝謝您的支持。
一世。
編輯:我認為這是一個很好的解決方案,可以找到例如 Office 版本: 描述
uj5u.com熱心網友回復:
注意:從 Python 呼叫 PowerShell 很方便(啟用簡潔的解決方案),但成本很高(單獨創建子行程需要時間,而且Get-ComputerInfo呼叫特別慢)。
最好的方法可能是:
讓 PowerShell 構造一個物件,其屬性包含所有感興趣的值,并以 JSON 格式輸出。
在 Python 中決議回傳的 JSON 文本并根據需要訪問決議物件的屬性。
這是您的PowerShell 腳本的簡化重組。
$cinfo = Get-ComputerInfo
# Construct and output and object whose properties contain all data of interest,
# in JSON format.
[pscustomobject] @{
winver = Get-ItemPropertyValue "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" ReleaseId
OsName = $cinfo.OsName
OsVersion = $cinfo.OsVersion
OsBuildNumber = $cinfo.OsBuildNumber
OsHardwareAbstractionLayer = $cinfo.OsHardwareAbstractionLayer
OfficeVer = Get-ItemPropertyValue "registry::HKEY_CLASSES_ROOT\Word.Application\CurVer" '(default)'
} | ConvertTo-Json
一個簡單的Python JSON 決議示例:
import json, subprocess
# Use a simplified sample call to PowerShell.
# In your code, use process_result.stdout
jsonFromPowerShell = subprocess.run(
['pwsh', '-noprofile', '-c', '''
[pscustomobject] @{ winver = 'foo'; osName = 'bar' } | ConvertTo-Json
'''],
stdout = subprocess.PIPE
).stdout
# Parse the JSON text into a dictionary.
dict = json.loads(jsonFromPowerShell)
# Enumerate the dictionary entries and print them.
for key in dict:
print(key ': ' dict[key])
輸出:
winver: foo
osName: bar
uj5u.com熱心網友回復:
檢查第一個屬性的這個答案。
檢查第二個屬性的這個答案。
我不確定 $OsVerrsion 和 $WinVersion 之間有什么區別。您正在運行 PowerShell,因此您正在運行 Windows。
內部版本號可通過第一個鏈接獲得。
因此,python 中至少有一些選項可用以獲取...
并且您已經有了在 Python 中獲取 Office 版本的示例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/380571.html
