Open Command Window in Windows x64 mode

后端 未结 2 1596
太阳男子
太阳男子 2021-01-15 06:21

I have an application which is installed in x64. I want to execute this EXE in x64 command prompt.

CASE 1:

If I open the command prompt man

相关标签:
2条回答
  • 2021-01-15 07:16

    It looks like you are using a 32-bit executable to run the batch file with elevated privileges. In this case the batch file is executed with 32-bit cmd.exe in %SystemRoot%\SysWOW64, see the Microsoft articles:

    • File System Redirector
    • WOW64 Implementation Details
    • Registry Keys Affected by WOW64

    As the batch file is already executed with elevated privileges and just needs to be processed by 64-bit cmd.exe on 64-bit Windows, here are the few lines to make sure that the batch file is executed by 64-bit Windows command processor on 64-bit 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
    

    Put your main batch code below the label :Maincode.

    The first IF condition jumps to main batch code if the batch file is running on 32-bit Windows where the environment variable ProgramFiles(x86) does not exist at all.

    The second IF condition only executed on 64-bit Windows jumps to main batch code if it cannot find the file %SystemRoot%\Sysnative\cmd.exe because the batch file is processed already by 64-bit cmd.exe.

    Sysnative is not a directory. It is a special alias which exists only when 32-bit environment is active on 64-bit Windows. For that reason it is only possible to use, for example, the condition if exist %SystemRoot%\Sysnative\* to check for existence of any file, but not the condition if exist %SystemRoot%\Sysnative to check for existence of the directory because of Sysnative is not a directory.

    For understanding the used commands and how they work, open a command prompt window, execute there the following commands, and read entirely all help pages displayed for each command very carefully.

    • cmd /?
    • echo /?
    • goto /?
    • if /?
    • pause /?
    • set /?
    0 讨论(0)
  • 2021-01-15 07:23

    The simplest way is to use the SysNative path. Here is a modified version of your RunAsAdmin.cmd (which was originally posted here: How can I auto-elevate my batch file, so that it requests from UAC administrator rights if required?) that does that:

    ::::::::::::::::::::::::::::::::::::::::::::
    :: 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
    
    0 讨论(0)
提交回复
热议问题