【问题标题】:Call 32-bit command line from 64-bit PowerShell从 64 位 PowerShell 调用 32 位命令行
【发布时间】:2016-03-17 13:39:58
【问题描述】:

我有一堆批处理文件需要从 32 位命令行调用。

我有这个代码:

$cmd = "C:\Windows\SysWOW64\cmd.exe"
$args="/C"
$pipe = "0 |"
Start-Process $cmd $args

如果我只调用 $cmd 它会打开命令行窗口。标题为“C:\windows\syswow64\cmd.exe”,但窗口中的路径为“C:\windows\system32”。

如何强制 PowerShell 运行所有批处理文件以在 32 位系统中运行?另外,由于某些批处理文件需要“按任意键继续”,我该如何使用 $pipe?

我能够使用以下代码运行 32 位命令行。

$CMD = "C:\Windows\SysWOW64\cmd.exe"
$test = 'C:\Update\test folder\test.cmd'
$proc = (Invoke-WmiMethod Win32_Process Create "$cmd /c $test")

但是,由于文件夹名称有空格,所以上面的代码不起作用。如果我删除文件夹名称中的空格,一切正常。

我尝试了双引号,单引号,$a = $test.tostring(),但没有成功。 我该如何解决这个问题?

【问题讨论】:

  • 如果您从 syswow64 调用 cmd.exe,它是 32 位可执行文件,显示的路径是工作目录,与您使用的可执行文件无关(除非您提供它将使用的工作目录调用时您的 powershell 所在的目录)。如果您想通过管道输入某些内容,则必须直接在脚本中进行操作,而不是通过变量。 Start-Process 也不接受随机管道输入,因此必须以另一种方式调用 cmd
  • 你为什么需要使用Start-Process?如果指定名称,PowerShell 可以运行批处理文件。
  • 您好 Bill,我需要能够在 32 位系统中调用批处理文件。我对此有疑问。
  • & $Env:SystemRoot\SysWOW64\cmd.exe /c D:\Path\test.bat 将使用 cmd.exe 的 32 位副本运行批处理文件。但是为什么你需要这样做呢?
  • 嗨,Bill,其中一个批处理文件调用了一个必须以 32 位运行的软件。这真的是一个很长的故事:) 谢谢你的帮助。

标签: powershell batch-file


【解决方案1】:

正在运行 32 位可执行文件。您可以通过显示 Image Type 列(View → Show Columns → Process Image)来验证这一点,例如 Process Explorer。 CMD窗口显示的路径只是工作目录,与进程是32位还是64位无关。

【讨论】:

  • 嗨 Ansgar,我能够确认它确实以 32 位运行 cmd。但是,现在我在调用批处理文件时遇到了问题。 start-process $cmd $batch(批处理文件的路径) 不起作用。它只是打开命令窗口。有什么想法吗?
  • 如果你运行Start-Process $cmd '/c "C:\path\to\your.cmd"',或者只运行& $cmd /c "C:\path\to\your.cmd"(没有Start-Process)会发生什么?
  • 启动进程出错“启动进程:此命令无法运行,因为错误:系统找不到指定的文件。”没有启动过程什么都不会发生
  • 那么您在$cmd 中的路径不正确。 echo "-$cmd-"Test-Path -LiteralPath $cmd 的输出是什么?
【解决方案2】:

我最终找到了下面的代码,它强制它以 32 位调用 cmd。

$NewProcInfo = New-Object System.Diagnostics.ProcessStartInfo
$NewProcInfo.FileName = "$CMD"
$NewProcInfo.RedirectStandardError = $true
$NewProcInfo.RedirectStandardOutput = $true
$NewProcInfo.UseShellExecute = $false
$Path = "`"$batchfile`""
$args = @("/c", "$Path")
$NewProcInfo.Arguments = "$args"
$Proc = New-Object System.Diagnostics.Process
$Proc.StartInfo = $NewProcInfo
$Proc.Start() | Out-Null
$Proc.WaitForExit()
$ReturnCode = $Proc.ExitCode

【讨论】:

  • & $Env:SystemRoot\SysWOW64\cmd.exe /c D:\Path\test.bat 要短得多。你也没有说为什么需要使用cmd.exe的32位副本。
  • 我厌倦了这种方法。但是当我按照 Ansgar 的建议检查进程资源管理器时,它显示 cmd 仍在 x64 下运行。我在上面的评论中回答了为什么我需要调用 32 位。
  • 不正确。 $Env:SystemRoot\SysWOW64\cmd.exe 是 32 位可执行文件。我怀疑您正在查看 cmd.exe 的错误实例。
【解决方案3】:

您最初的解决方案奏效了。你刚刚犯了经典的思维错误。

你从C:\Windows\SysWOW64开始32位cmd.exe

DOS 框当然会显示您当前的目录C:\Windows\System32。它是一个 32 位应用程序。 C:\Windows\System32 在 64 位 Windows 上的 32 位应用程序中实际上是目录 C:\Windows\SysWOW64

您只是被锁定在 DOS 框内的 32 位环境中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-16
    • 2019-12-17
    • 2011-10-25
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    相关资源
    最近更新 更多