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

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

情况1:

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

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

情况2:

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

 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 。 我认为ProgramFilespath的差异可能是我的EXE在第二种情况下不起作用的原因。 如何在脚本中指定它应该在x64命令提示符下执行?

PS:我的主要问题的链接在这里 。

参考文献:提升到Admin的脚本文件已经从Matt的回答中拿出来了。

Solutions Collecting From Web of "在Windows x64模式下打开命令窗口"

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

  • 文件系统重定向器
  • WOW64实现细节
  • 受WOW64影响的注册表键

由于批处理文件已经以较高的权限执行,只需要在64位Windows上通过64位cmd.exe进行处理,以下是确保批处理文件由64位Windows命令解释程序执行的几行在64位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

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

如果第二个IF条件只能在64位Windows上执行,则会跳转到主批处理代码,因为该批处理文件已经被64位cmd.exe处理过了,所以它可以找到%SystemRoot%\Sysnative\cmd.exe文件。

系统不是一个目录。 它是一个特殊的别名,只有在64位Windows上的32位环境激活时才存在。 因此,只有if exist %SystemRoot%\Sysnative\* (检查任何文件)时才可以使用,但if exist %SystemRoot%\Sysnative (检查目录),则不能使用。

为了理解使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • cmd /?
  • echo /?
  • goto /?
  • if /?
  • pause /?
  • set /?

最简单的方法是使用SysNative路径。 这里是你的RunAsAdmin.cmd的修改版本(最初是在这里发布的: 如何自动提升我的批处理文件,以便它从UAC管理员权限请求? ),那样做:

 :::::::::::::::::::::::::::::::::::::::::::: :: 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