【问题标题】:Scripts executed by a WinRar self-extracting archive not behaving as expected由 WinRar 自解压存档执行的脚本未按预期运行
【发布时间】:2020-12-25 10:56:35
【问题描述】:

我设置了一个自解压 WinRar 存档,以便在完成后运行一个 powershell 脚本。脚本将启动,但特定命令未给出预期结果。

特别是,我有以下命令来查找已安装游戏的安装路径(下雨的风险2)。

Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall | % { Get-ItemProperty $_.PsPath } | Where-Object {$_.DisplayName -like 'Risk of Rain 2'} | Select InstallLocation -ExpandProperty InstallLocation

当自己运行脚本时,我得到了预期的安装路径。

F:\SteamLibrary\steamapps\common\Risk of Rain 2

当脚本启动时(无论是在提取之前还是之后),命令似乎都在运行,但什么也不输出。

在测试中,我删除了除以下内容之外的所有内容:

Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall | % { Get-ItemProperty $_.PsPath } 

这仍然有效,输出已安装应用程序的列表。当我将管道添加到“Where-Object”部分时,它开始失败。

我唯一的猜测是 WinRar 启动脚本时设置了一些其他参数。

我尝试让 Winrar 启动一个 .bat,然后运行 ​​.ps1 文件,但结果相同。以管理员身份运行存档也是如此。

我的 powershell 脚本有什么奇怪的地方,还是我只是缺少 Winrar 处理事情的方式?

谢谢!

【问题讨论】:

  • 好的,所以只要检查一下我是否正确。如果将“Where-object”存储在 WinRar 中,会出现错误?也许问题可能是由于 WinRar 的命名如何工作?也许出于归档原因,它在单词之间放置了 - 而不是空格?这会导致你的“Where-object”失败。我只是在这里推测,但尝试摆弄单词之间的空格。
  • @TheGrandJ 谢谢,我检查了文件名/路径,它们都使用下划线代替空格。脚本开始没问题,所以我认为路径没问题。该命令不应该关心它在哪里运行,但也许它确实......这很奇怪,哈哈。

标签: powershell archive winrar self-extracting


【解决方案1】:

因此,根据您的评论,存档使用下划线代替空格。所以看看你的代码,我们最初看到的是这个

Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall | % { Get-ItemProperty $.PsPath } | Where-Object {$.DisplayName -like 'Risk of Rain 2'} |选择 InstallLocation -ExpandProperty InstallLocation

当我们尝试包含 Where 对象时会出现您的错误。所以我相信你的问题的解决方案应该是这样修改你的代码:

Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall | % { Get-ItemProperty $_.PsPath } | Where-Object {$_.DisplayName -like 'Risk_of_Rain_2'} | Select InstallLocation -ExpandProperty InstallLocation

基本上我们将 -like 从“Risk of Rain 2”更改为“Risk_of_Rain_2”

我相信这应该可以解决问题,因为它被 WinRar 调用它可能仍然使用下划线名称。由于您正在检查一个类似名称,该名称仅表明它可以在类似字符串中的单词之后或之前包含任意数量和类型的字符。 like 字符串本身是准确的。

【讨论】:

    【解决方案2】:

    所以...WinRAR 为使用的 SFX 模块提供了选项。当我应该使用 Zip64.SFX 时,我使用的是默认的 Zip.SFX 模块。

    它之前打开的 powershell 会话是 32 位的,从注册表中读取已安装的程序时会给出不同的结果。

    如果您在提取后运行的命令中有任何特定于 32/64 位的内容,请确保在高级 SFX 选项中选择了正确的模块。

    谢谢大家的帮助!

    Advanced SFX options

    【讨论】:

    • 我建议阅读 Microsoft 文档 WOW64 Implementation DetailsFile System RedirectorRegistry Keys Affected by WOW64。那么你应该知道为什么使用 32 位 SFX 模块会导致执行 32 位 PowerShell,它在 32 位 Uninstall 注册表项中找不到注册表项 Risk of Rain 2
    • 我还建议阅读有关Application Registration 的Microsoft 文档。可能是游戏Risk of Rain 2的可执行文件在安装后注册为应用程序,在这种情况下,最好使用App Paths注册表项来获取独立于WOW64的安装目录,而不是卸载注册表项存在两次,一次用于 64 位应用程序,一次用于 32 位应用程序。
    猜你喜欢
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    相关资源
    最近更新 更多