2017-01-05 1 views
1

Ich habe eine Anwendung, die in x64 installiert ist. Ich möchte diese EXE in x64-Eingabeaufforderung ausführen.Öffnen Sie das Befehlsfenster im Windows x64-Modus

CASE 1:

Wenn ich die Eingabeaufforderung manuell als Admin öffnen (Start->Type, cmd.exe->Right click->Run as Administrator), dann die EXE gut funktioniert. Ich erhalte die folgenden Spezifikationen über die Umgebungsvariablen mit SET Befehl cmd ein Fenster:

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

CASE 2:

Wenn ich öffnen Sie das Befehlsfenster ein Skript-Datei, die dann an die Admin-Rechten erhebt die EXE wird nicht gefunden. Ich erhalte die folgenden Werte für die Variablen Umgebungen mithilfe von SET Befehl:

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 

Frage: Ich habe mit Fall 2 arbeiten. Ich denke, dass die Diskrepanz in den Pfaden von ProgramFiles der Grund sein könnte, dass meine EXE im zweiten Fall nicht funktioniert. Wie kann ich im Skript angeben, dass es in x64-Eingabeaufforderung ausgeführt werden soll?

PS: Der Link zu meinem Hauptproblem ist here.

Referenzen: Die Skriptdatei Admin zu erhöhen wurde von Matt Antwort genommen given here.

Antwort

1

Es sieht aus wie Sie ein 32-Bit-Programm verwenden, um die Batchdatei mit erweiterten Rechten auszuführen. In diesem Fall wird die Batch-Datei mit 32-Bit-cmd.exe in %SystemRoot%\SysWOW64 finden Sie in dem Microsoft MSDN-Artikel

ausgeführt

Wie die Batch-Datei bereits mit ausgeführt wird erhöhte Rechte und muss nur von 64-Bit cmd.exe auf 64-Bit-Windows verarbeitet werden, hier sind die paar Zeilen, um sicherzustellen, dass die Batch-Datei von 64-Bit ausgeführt wird Bit Windows-Befehlsinterpreter auf 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 

Setzen Sie Ihre Haupt-Batch Code unter dem Label :Maincode.

Der ersten IF Zustand springt zum Hauptcodereihe, wenn die Batch-Datei auf 32-Bit-Windows ausgeführt wird, in dem die Umgebungsvariable ProgramFiles(x86) überhaupt nicht existieren.

Der zweite IF Zustand nur auf 64-Bit-Windows ausgeführt springt zum Hauptcodereihe, wenn sie die Datei %SystemRoot%\Sysnative\cmd.exe weil die Batch-Datei verarbeitet wird bereits von 64-Bit-cmd.exe finden.

Sysnative ist kein Verzeichnis. Es ist ein spezieller Alias, der nur existiert, wenn eine 32-Bit-Umgebung auf 64-Bit-Windows aktiv ist. Aus diesem Grund ist es nur möglich, if exist %SystemRoot%\Sysnative\* zu benutzen (auf irgendeine Datei prüfen), aber nicht if exist %SystemRoot%\Sysnative (nach Verzeichnis suchen).

Um die verwendeten Befehle und ihre Funktionsweise zu verstehen, öffnen Sie ein Eingabeaufforderungsfenster, führen Sie die folgenden Befehle aus und lesen Sie alle Hilfeseiten, die für jeden Befehl angezeigt werden, sorgfältig durch.

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

Vielen Dank, ich denke, es hat mein Problem gelöst, wird aber nach dem Testen auf meinem Windows Embedded System aktualisieren. – skm

1

Der einfachste Weg ist es, die Sysnative Pfad zu verwenden. Hier ist eine modifizierte Version des RunAsAdmin.cmd (die ursprünglich hier gepostet: How can I auto-elevate my batch file, so that it requests from UAC administrator rights if required?), der das tut:

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

Plagiate von [Matts Beitrag] (http://stackoverflow.com/a/12264592/17034), pro pro Attribution ist die Site-Lizenz erforderlich. –

+0

Wie ich Mofi bereits gesagt habe, kam es von der ursprünglichen Frage von SKM. Ich wusste nicht, dass es vorher gepostet wurde. Da Sie einen Link zum Original bereitgestellt haben, habe ich das jetzt in meine Antwort aufgenommen. – Richard

+0

Nun, Matts Code funktioniert nicht, wenn die Batch-Datei mit 1 oder mehr Parametern in doppelten Anführungszeichen ausgeführt wird, weil die Parameter-Strings 1 oder mehr Leerzeichen enthalten. Zum Beispiel über der Zeile mit 'exit/B' die Zeile 'echo% * & pause' einfügen, wobei 'ewfmgr c: -enable' durch 'echo% *' ersetzt wird, indem diese Batch-Datei mit '"% ProgramFiles% "" Hallo ausgeführt wird world "' und das Klicken auf die Schaltfläche Yes bei der Eingabeaufforderung für die Elevation führt zu zwei Konsolenfenstern. Die untere ist vom ersten Aufruf mit der Liste der korrekten Argumente, und die oberste ist die mit falscher Argumentliste, weil doppelte Anführungszeichen verloren gegangen sind. – Mofi

Verwandte Themen