从Python程序中获取WinWord版本

3
在一个简单的Python程序中,用于测试用户环境,我还应该获得安装的Word版本(例如:WinWord 16,64位)。你有什么想法吗?我确定不同的GUID应该存在,但我在哪里可以找到它们呢:-)
****编辑
我检查了两个建议,但这还不够。我必须获取Word是32位还是64位的信息。到目前为止,我已经检查了“winword.exe”的位置。例如:1.64位Office 15的位置c:\program files\microsoft office\office15\winword.exe 2.32位Office 15的位置c:\program files (x86)\microsoft office\office15\winword.exe 我相信微软有最新版本Word的GUID列表(在注册表中使用)。但我找不到这个列表 :-)使用建议的解决方案,我无法检查32位或64位技术。

只是想确保您看到了我的更新版本。它可以检测架构以及版本。 - Neil
这正是它所做的,如果你找到更好的方法,请告诉我。 - Neil
但说实话,我喜欢你的解决方案。因为我是Python新手 - 在for循环中应该改变什么来检查所有子文件夹并在其中找到快捷方式? - JanezKranjski
现在,突然之间(在此函数中没有任何更改的情况下),我收到了一个错误: “./SamplePowershell”一词不被识别为 cmdlet、函数、脚本文件或可操作程序的名称。请检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。 位于:1字符:3
  • . "./SamplePowershell"; (New-Object -ComObject WScript.Shell).CreateS ...
  • + CategoryInfo : ObjectNotFound: (./SamplePowershell:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
- JanezKranjski
太好了,现在它运作正常。我搜索了“SamplePowershell”参数,但是我什么都没有找到(可以帮助我什么呢?:-))。 - JanezKranjski
显示剩余8条评论
2个回答

2

使用架构检测(32位或64位)搜索快捷方式

我认为额外的信息可能会有用,但您可以将其缩减为只包括32位和64位。

import subprocess, os, struct

def getWordVersion():
    directory = "C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs"
    wordFile = ""
    wordVersion = ""

    def recursiveSearch(directory):
        for root, dirs, filenames in os.walk(directory):
            for dire in dirs:
                result = recursiveSearch(root + "\\" + dire)
                if result:
                    return result
            for filename in filenames:
                if filename.endswith(".lnk") and filename.startswith("Word "):
                    wordFile = root + "\\" + filename
                    wordVersion = filename[:-4]
                    return wordFile, wordVersion
        return False

    wordFile, wordVersion = recursiveSearch(directory)

    lnkTarget = subprocess.check_output(["C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\powershell.exe",
                      "(New-Object -ComObject WScript.Shell).CreateShortcut('" + wordFile + "').TargetPath"],shell=True)
    locationOfLnk = lnkTarget.strip()

    IMAGE_FILE_MACHINE_I386=332
    IMAGE_FILE_MACHINE_IA64=512
    IMAGE_FILE_MACHINE_AMD64=34404
    f=open(locationOfLnk, "rb")

    f.seek(60)
    s=f.read(4)
    header_offset=struct.unpack("<L", s)[0]
    f.seek(header_offset+4)
    s=f.read(2)
    machine=struct.unpack("<H", s)[0]
    architecture = ""

    if machine==IMAGE_FILE_MACHINE_I386:
        architecture = "IA-32 (32-bit x86)"
    elif machine==IMAGE_FILE_MACHINE_IA64:
        architecture = "IA-64 (Itanium)"
    elif machine==IMAGE_FILE_MACHINE_AMD64:
        architecture = "AMD64 (64-bit x86)"
    else:
        architecture = "Unknown architecture"

    f.close()
    return wordVersion + " "  + architecture

print(getWordVersion())

注册表方法

一种方法是循环遍历 Office 下的所有注册表键,并找到最新的键。不幸的是,微软几乎在每个版本中都决定更改安装目录。因此,如果您想编译所有安装位置的完整列表,那也可以(除非他们将其安装在自定义位置)。

注意:这是 Python 3 代码,如果您需要 Python 2,则将 winreg 更改为 _winreg

import winreg

def getMicrosoftWordVersion():
    key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Office", 0, winreg.KEY_READ)
    versionNum = 0
    i = 0
    while True:
        try:
            subkey = winreg.EnumKey(key, i)
            i+=1
            if versionNum < float(subkey):
                versionNum = float(subkey)
        except: #relies on error handling WindowsError as e as well as type conversion when we run out of numbers
            break
    return versionNum


print(getMicrosoftWordVersion())

谢谢,我会检查。 - JanezKranjski
程序快捷方式方法依赖于标准快捷方式位置和名称,这些可以由用户更改。注册表方法相当低级(在我看来)。 - lospejos
是的,我同意。但是一般来说,人们不会修改由Word安装创建的快捷方式,这些快捷方式存放在预设为开始菜单快捷方式的文件夹中。老实说,这有点像说“用户可能已更改了注册表键”。他们可以吗?是的。会吗?可能不会。我试图让您的win32com起作用,但没有什么好运。所以,我将保留我的解决方案。 - Neil

0

另一种方法是使用OLE/ActiveX/COM技术。这是提供的“注册表方法”的某种高级版本。 假设您正在Windows机器上,因为在大多数情况下,这将无法在Linux上工作:

#!/usr/bin/env python3
from win32com.client.dynamic import Dispatch

word = Dispatch('Word.Application')
print (word)
word_version = word.version
print (word_version)
  1. 创建虚拟环境:$ python -m venv ve
  2. 激活虚拟环境:$ ve\Scripts\activate.bat
  3. 安装pypiwin32:(ve)$ pip install pypiwin32
  4. 执行:(ve)$ python detect_msword_version.py

在我的Windows机器上输出为:

Microsoft Word

16.0


谢谢,我会检查一下。 - JanezKranjski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接