簡體   English   中英

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

[英]Open Command Window in Windows x64 mode

我有一個安裝在 x64 中的應用程序。 我想在 x64 命令提示符下執行這個 EXE。

情況1:

如果我以管理員身份手動打開命令提示符( 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

問題:我必須使用Case 2 我認為ProgramFiles路徑的差異可能是我的 EXE 在第二種情況下不起作用的原因。 如何在腳本中指定它應該在 x64 命令提示符下執行?

PS:我的主要問題的鏈接是here

參考:提升為管理員的腳本文件取自這里給出的Matt 的回答

看起來您正在使用 32 位可執行文件以提升的權限運行批處理文件。 在這種情況下,批處理文件使用%SystemRoot%\\SysWOW64 32 位cmd.exe執行,請參閱 Microsoft 文章:

由於批處理文件已經以提升的權限執行,只需要在 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條件跳轉到主批處理代碼。

僅在 64 位 Windows 上執行的第二個IF條件如果找不到文件%SystemRoot%\\Sysnative\\cmd.exe則跳轉到主批處理代碼,因為批處理文件已由 64 位cmd.exe

Sysnative不是目錄。 它是一個特殊的別名,僅當 32 位環境在 64 位 Windows 上處於活動狀態時才存在。 出於這個原因,例如只能使用條件if exist %SystemRoot%\\Sysnative\\*來檢查任何文件的存在,而不可以使用條件if exist %SystemRoot%\\Sysnative來檢查目錄是否存在因為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM