在Windows x64模式下打开命令窗口

时间:2017-01-05 13:26:16

标签: windows batch-file cmd

我有一个安装在x64中的应用程序。我想在x64命令提示符下执行此EXE。

案例1:

如果我以Admin(Start->Type, cmd.exe->Right click->Run as Administrator)手动打开命令提示符,则EXE正常工作。我在cmd窗口中使用SET命令获得了有关环境变量的以下规范:

CommonProgramFiles=c:\Program Files\Common Files
CommonProgramFiles(x86)=c:\Program Files (x86)\Common Files
CommonProgramW6432=c:\Program Files\Common Files
PROCESSOR_ARCHITECTURE=AMD64

案例2:

如果我使用提升为管理员权限的脚本文件打开命令窗口,则找不到EXE。我使用SET命令获取环境变量的以下值:

CommonProgramFiles=c:\Program Files (x86)\Common Files
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=AMD64
ProgramFiles=c:\Program Files (x86)
ProgramFiles(x86)=c:\Program Files (x86)

winSysFolder=System32

问题:我必须使用 案例2 。我认为ProgramFiles路径中的差异可能是我的EXE在第二种情况下无法工作的原因。 如何在脚本中指定应在x64命令提示符下执行?

PS:我的主要问题的链接是here

参考文献:提升为管理员的脚本文件取自Matt的回答given here.

2 个答案:

答案 0 :(得分:1)

最简单的方法是使用SysNative路径。以下是RunAsAdmin.cmd的修改版本(最初发布在此处:How can I auto-elevate my batch file, so that it requests from UAC administrator rights if required?),可以执行此操作:

::::::::::::::::::::::::::::::::::::::::::::
:: Elevate.cmd - Version 4
:: Automatically check & get admin rights
::::::::::::::::::::::::::::::::::::::::::::
 @echo off
 CLS
 ECHO.
 ECHO =============================
 ECHO Running Admin shell
 ECHO =============================

:init
 setlocal DisableDelayedExpansion
 set cmdInvoke=0
 set winSysFolder=System32
 IF EXIST %SystemRoot%\SysNative\cmd.exe set winSysFolder=SysNative
 set "batchPath=%~0"
 for %%k in (%0) do set batchName=%%~nk
 set "vbsGetPrivileges=%temp%\OEgetPriv_%batchName%.vbs"
 setlocal EnableDelayedExpansion

:checkPrivileges
  NET FILE 1>NUL 2>NUL
  if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )

:getPrivileges
  if '%1'=='ELEV' (echo ELEV & shift /1 & goto gotPrivileges)
  ECHO.
  ECHO **************************************
  ECHO Invoking UAC for Privilege Escalation
  ECHO **************************************

  ECHO Set UAC = CreateObject^("Shell.Application"^) > "%vbsGetPrivileges%"
  ECHO args = "ELEV " >> "%vbsGetPrivileges%"
  ECHO For Each strArg in WScript.Arguments >> "%vbsGetPrivileges%"
  ECHO args = args ^& strArg ^& " "  >> "%vbsGetPrivileges%"
  ECHO Next >> "%vbsGetPrivileges%"

  if '%cmdInvoke%'=='1' goto InvokeCmd 

  ECHO UAC.ShellExecute "!batchPath!", args, "", "runas", 1 >> "%vbsGetPrivileges%"
  goto ExecElevation

:InvokeCmd
  ECHO args = "/c """ + "!batchPath!" + """ " + args >> "%vbsGetPrivileges%"
  ECHO UAC.ShellExecute "%SystemRoot%\%winSysFolder%\cmd.exe", args, "", "runas", 1 >> "%vbsGetPrivileges%"

:ExecElevation
 "%SystemRoot%\%winSysFolder%\WScript.exe" "%vbsGetPrivileges%" %*
 exit /B

:gotPrivileges
 setlocal & pushd .
 cd /d %~dp0
 if '%1'=='ELEV' (del "%vbsGetPrivileges%" 1>nul 2>nul  &  shift /1)

 ::::::::::::::::::::::::::::
 ::START
 ::::::::::::::::::::::::::::
 REM Run shell as admin (example) - put here code as you like
 ewfmgr c: -enable
 pause
 cmd /k

答案 1 :(得分:1)

看起来您正在使用32位可执行文件以提升的权限运行批处理文件。在这种情况下,批处理文件在cmd.exe中使用32位%SystemRoot%\SysWOW64执行,请参阅Microsoft文章:

由于批处理文件已经使用提升的权限执行,并且只需要在64位Windows上由64位cmd.exe处理,因此以下几行可确保批处理文件由64执行在64位Windows上运行Windows命令解释器。

@echo off
if "%ProgramFiles(x86)%" == "" goto MainCode
if not exist %SystemRoot%\Sysnative\cmd.exe goto MainCode
%SystemRoot%\Sysnative\cmd.exe /C "%~f0" %*
goto :EOF

:MainCode
set Program
pause

将主批代码放在标签:Maincode下方。

如果批处理文件在32位Windows上运行且环境变量ProgramFiles(x86)根本不存在,则第一个 IF 条件会跳转到主批处理代码。

仅在64位Windows上执行的第二个 IF 条件跳转到主批处理代码,如果它可以找到文件%SystemRoot%\Sysnative\cmd.exe,因为批处理文件已由64位{{ 1}}。

cmd.exe不是目录。它是一个特殊别名,仅在64位Windows上32位环境处于活动状态时才存在。因此,只能使用Sysnative(检查任何文件),而不是if exist %SystemRoot%\Sysnative\*(检查目录)。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • if exist %SystemRoot%\Sysnative
  • cmd /?
  • echo /?
  • goto /?
  • if /?
  • pause /?