Batchdatei wird nur vom Laufwerk C: ordnungsgemäß ausgeführt

1

Ich habe die folgende Batch-Datei, die eine Netzwerkfreigabe mit cmd als Administrator erstellt. Wenn es von einem beliebigen Verzeichnis auf dem Laufwerk c: ausgeführt wird, werden zwei Eingabeaufforderungsfenster geöffnet, und es wird darauf gewartet, dass der Benutzer eine Taste drückt. Bei Ausführung von einem anderen Laufwerk blinkt jedoch schnell 2 Eingabeaufforderungsfenster, wird ausgeblendet und der Befehl wird nicht ausgeführt. Wie kann ich es von jedem Laufwerk aus zum Laufen bringen?

@echo off
:: BatchGotAdmin
::-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    set params = %*:"="
    echo UAC.ShellExecute "cmd.exe", "/c %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs"
    del "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    pushd "%CD%"
    CD /D "%~dp0"
::--------------------------------------

::ENTER YOUR CODE BELOW:
net share sharename=C:\tada /grant:everyone,FULL

echo ...
echo ...
echo PLEASE CHECK ABOVE IF SHARE WAS SUCCESFUL. YOU MAY NOW CLOSE THE WINDOW(S)
echo ...
echo ...
pause

Aktualisieren:

Ausführen aus einem beliebigen Unterverzeichnis in C:Works. Laufen es von G:Werken. Das Ausführen von G:\Users\myname\Documents\couple_more_subfoldersfunktioniert nicht

Blaine
quelle
scheint identisch zu dem zu sein, was dieser Typ beschreibt. Ich kann nicht herausfinden, wo ich
Blaine
Zumindest könnten Sie das VBS-Bit wahrscheinlich durch PowerShell ersetzen. Trivialerweise powershell -c start -verb runas "%0"würde es ohne eine temporäre Datei tun. Ich bin mir nicht sicher, ob das Ihr Problem lösen würde.
Bob
Wenn Sie tatsächlich überprüfen möchten, was sich in den Fenstern befindet, entfernen @echo offSie zuerst das Symbol, damit Sie sehen können, welche Befehle ausgeführt werden. Ersetzen Sie dann alle Stellen, an denen Sie die Batch-Datei aufrufen, z. B. durch %0, cmd /k %0damit das Fenster auch dann angezeigt wird, wenn das Skript vorzeitig beendet wird.
Bob
@ Bob danke für die Hilfe. Ich fürchte, ich weiß fast nichts über Batch (habe dieses Skript online gestellt und nur Änderungen unterhalb der -------- -Zeile vorgenommen). Ich sehe nirgendwo mit %0. Wo soll ich setzen cmd /k?
Blaine
In Ihrem Fall UAC.ShellExecuteersetzen Sie in der Zeile das /cmit /k. Aber ich würde PS definitiv über VBS empfehlen.
Bob

Antworten:

2

Ich habe ein anderes Skript gefunden, das dieses Problem nicht hat. Es stellt sich heraus, dass der erste fehlschlägt, wenn in dem Dateipfad, in dem er sich befindet, ein Leerzeichen vorhanden ist (das hatte also wirklich nichts mit dem Laufwerksbuchstaben zu tun):

@echo off
if _%1_==_payload_  goto :payload

:getadmin
    echo %~nx0: elevating self
    set vbs=%temp%\getadmin.vbs
    echo Set UAC = CreateObject^("Shell.Application"^)                >> "%vbs%"
    echo UAC.ShellExecute "%~s0", "payload %~sdp0 %*", "", "runas", 1 >> "%vbs%"
    "%temp%\getadmin.vbs"
    del "%temp%\getadmin.vbs"
goto :eof

:payload
    ::echo %~nx0: running payload with parameters:
    ::echo %*
    echo ---------------------------------------------------
    cd /d %2
    shift
    shift
    net share sharename=C:\tada /grant:everyone,FULL
echo ...
echo ...
echo PLEASE CHECK ABOVE IF SHARE WAS SUCCESFUL. YOU MAY NOW CLOSE THE WINDOW(S)
echo ...
echo ...
pause
goto :eof
Blaine
quelle
Zusätzlicher Hinweis: Setzen Sie den Dateipfad des Freigabenamens in Anführungszeichen, falls der Pfad ein Leerzeichen enthält
Blaine