【问题标题】:Force a vbscript to open command prompt in 64bit instead of 32bit强制 vbscript 以 64 位而不是 32 位打开命令提示符
【发布时间】:2015-09-12 21:28:27
【问题描述】:

我整天都在努力让这个脚本工作!

以下是关于我的情况的一些事实......

  • 我的“C:\Windows\System32\”文件夹中有一个名为“ffmpeg.exe”的程序。
  • 我的“C:\Windows\SysWOW64\”文件夹中没有该程序。

目前这是我的脚本...

Option Explicit

Dim oFSO, oShell, sCommand
Dim sFilePath, sTempFilePath

Set oFSO = CreateObject("Scripting.FileSystemObject")

sFilePath = "C:\test\in_video.mkv"
sTempFilePath = "C:\test\out_video.mp4"

sCommand = "%comspec% /k ffmpeg -n -i """ + sFilePath + """ -c:v copy -c:a copy """ + sTempFilePath + """"
WScript.Echo sCommand
Set oShell = WScript.CreateObject("WScript.Shell")
oShell.Run sCommand, 1, True
Set oShell = Nothing

Set oFSO = Nothing

如果我在命令提示符下手动运行此脚本,那么它似乎工作得很好。但是,如果我让另一个应用程序运行它(例如在本例中为 uTorrent),它会按预期运行脚本,但是当它尝试处理 oShell.Run 命令时,它会在 32 位环境中运行它!然后我得到这个...

如果我尝试打开一个新的命令提示符(没什么特别的),我似乎默认为 64 位环境,然后我可以输入“ffmpeg”,它会按预期显示帮助内容。

所以由于某种原因,我无法让脚本在 64 位环境中运行应用程序(特别是 CMD)。有谁知道我怎么能做到这一点?


更新

看来我的脚本实际上是在 32 位模式下运行的!虽然脚本标题栏写着“C:\Windows\System32\cscript.exe”,是64位环境!!

我用下面的脚本确定它是在32位环境下运行的……

Dim WshShell
Dim WshProcEnv
Dim system_architecture
Dim process_architecture

Set WshShell =  CreateObject("WScript.Shell")
Set WshProcEnv = WshShell.Environment("Process")

process_architecture= WshProcEnv("PROCESSOR_ARCHITECTURE") 

If process_architecture = "x86" Then    
    system_architecture= WshProcEnv("PROCESSOR_ARCHITEW6432")

    If system_architecture = ""  Then    
        system_architecture = "x86"
    End if    
Else    
    system_architecture = process_architecture    
End If

WScript.Echo "Running as a " & process_architecture & " process on a " _ 
    & system_architecture & " system."

【问题讨论】:

  • 运行 c:\windows\sysnative\cmd.exe
  • C:\Windows\system32\cmd.exe 已经是 64 位命令提示符(32 位在 C:\Windows\SysWOW64 中)。如果您更改为sCommand = "%comspec% /k set path",会输出什么?那么sCommand = "%comspec% /k where ffmpeg" 呢?您的administrator 可以使用另一个环境变量池...
  • Next 应该足够了:在您的脚本打开的 CLI 中并出现 'ffmpeg' is not recognized... 错误消息,尝试 where ffmpegset path 命令。全部在显示的当前目录C:\Users\Administrator\Desktop下。也许调用应用程序破坏了您的 pathpathext 环境变量...

标签: vbscript ffmpeg windows-server-2008-r2


【解决方案1】:

如果它仅用于 cmd 或 System32 中的某些文件,您可以按照评论的建议使用sysnative。即使从 32 位可执行文件,它也会导致 64 位 System32。每次使用只需将“system32”替换为“sysnative”即可。 (不幸的是,这在 32 位 Windows 上不存在,因此您需要检查是否在具有两种架构的系统上使用脚本...)

如果您有很多访问权限或使用 com 对象,我发现使用相同的方法重新启动脚本会更容易。以下代码:

If fso.FileExists("C:\Windows\SysWOW64\wscript.exe") Then ' very basic check for 64bit Windows, you can replace it with a more complicated wmi check if you find it not reliable enough
    If InStr(1, WScript.FullName, "SysWOW64", vbTextCompare) <> 0 Then ' = case insensitive check
        newFullName = Replace(WScript.FullName, "SysWOW64", "Sysnative", 1, -1, vbTextCompare) ' System32 is replaced by Sysnative to deactivate WoW64, cscript or wscript stay the same
        newArguments = "" ' in case of command line arguments they are passed on
        For Each arg In WScript.Arguments
            newArguments = newArguments & arg & " "
        Next
        wso.Run newFullName & " """ & WScript.ScriptFullName & """ " & newArguments, , False
        WScript.Quit '32 Bit Scripting Host is closed
    End If
End If

每当使用 32 位脚本主机调用脚本时,基本上都会关闭脚本,然后使用 64 位脚本主机重新启动它,以便在预期的位置找到所有内容。

【讨论】:

  • 是的,我在 SO 的其他地方找到了答案。 ;) 但是我没有使用它的原因是因为我正在运行的脚本目前是在 64 位运行的。只是对 .Run 的调用似乎以 32 位运行。有没有办法让 .Run 调用改为选择 64 位?
  • 看来你是对的......我要试一试,因为(正如我在上面的更新中指出的那样)似乎我的脚本确实以某种方式以 32 位运行!谢谢!
  • 似乎成功了!我仍然不知道为什么它以 32 位运行,或者为什么标题栏没有反映这一点,但这个答案确实是正确的解决方案!谢谢!
  • 很好用。它在 32 位上运行的原因可能是 WoW64 仿真窗口用来“欺骗”64 位 Windows 安装上的 32 位窗口。如果您的 uTorrent 是 32 位进程,Windows 将按照 32 位 Windows 上的预期显示程序的所有文件夹(因此基本上将 SysWoW64 呈现为 System32,并且与注册表和程序文件相同)这将导致 32 位 wscript.exe 用于您的脚本,然后它再次获得模拟的文件夹。这是一个兼容性功能(并且效果很好),但它使调试和理解真正发生的事情变得困难。
  • 后来发现确实如此。 ;) 忘记在此处更新线程。再次感谢!
猜你喜欢
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 2016-07-13
  • 1970-01-01
  • 2012-12-03
  • 2015-01-07
相关资源
最近更新 更多