将 Powershell 变量的值获取到 Python (wxGlade) GUI

Posted

技术标签:

【中文标题】将 Powershell 变量的值获取到 Python (wxGlade) GUI【英文标题】:Get the value of a Powershell Variables to a Python (wxGlade) GUI 【发布时间】:2022-01-17 04:13:48 【问题描述】:

我们这里有一个 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) 代码。 (Running PowerShell Script from Python) 我会用一些高级的 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 代码收集所有这些信息是否更容易?

感谢您的支持。

我。

编辑:我认为这是找到 e 的好方法。 G。办公版: Description

【问题讨论】:

到处使用 Python 更容易?当一切都可以从 Python 获得时,为什么还要使用 3rd 方工具? 您好,如果有任何本地 python 库可以获取此类信息,我很高兴听到。我怎么能e。 G。用 Python 读取 office 版本号? 【参考方案1】:

注意:从 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

【讨论】:

非常感谢!看起来还不错。我将研究如何在 Python 中解析 json 文件……我认为通过 JSON 的方式总是可以解决从 PS 到 PY 传输值的解决方案……对吗? @IstvanTurbucz,是的,这种技术应该可以正常工作(在 JSON 可以表示的数据类型的限制范围内)。至于在 Python 中解析 JSON:请看我的更新。 @IstvanTurbucz,我无法真正帮助调试您的代码,而 Stack Overflow 并非真正用于此目的(对您的代码的最终想法:PowerShell 调用发生在方法内部,但您重新尝试访问存储结果的变量在该方法之外,这将不起作用)。如果您遇到一个可以作为普遍关注的问题提出的特定问题,请提出一个问题。【参考方案2】:

检查this answer 以获得第一个属性。

检查this answer 以获得第二个属性。

我不确定 $OsVerrsion 和 $WinVersion 之间有什么区别。您正在运行 PowerShell,因此您正在运行 Windows。

内部版本号可通过第一个链接获得。

因此,python 中至少有一些选项可以获取...

您已经有了用 Python 获取 Office 版本的示例。

【讨论】:

以上是关于将 Powershell 变量的值获取到 Python (wxGlade) GUI的主要内容,如果未能解决你的问题,请参考以下文章

如何在PowerShell中获取变量名称

将输入变量从PowerShell表单传递到cmdlet参数会导致空白数据

如何在不扩展令牌的情况下获取 PATH 环境变量的值?

如何使用 PowerShell 和 SQLCMD 获取存储过程返回值?

Powershell Invoke-Restmethod不能将生成的Authtoken用作变量

PowerShell 中带括号的环境变量名称,如 %ProgramFiles(x86)%?