![- Warum?](https://rvso.com/image/1692552/-%20Warum%3F.png)
Ich habe die vorgeschlagene Lösung eingegebenProtokollieren einer gesamten Batchdateiausgabe.
Funktioniert aber nur, wenn unser Batch-Skript keinen Administratorzugriff anfordert oder Benutzereingaben entgegennimmt.
In meinem Skript nehme ich den Administratorzugriff und habe auch Benutzereingaben:
@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"
::--------------------------------------
set LOGFILE=batch.log
call :LOG > %LOGFILE%
exit /B
:LOG
REM Set IP address to USB Ethernet
echo "Set IP address to USB Ethernet :"
set /p SystemIP="Enter the System IP address[127.*.*.*]:"
set /p SystemSubnetMask="Enter the System Subnetmark[Default:255.255.255.0]:"
IF [%system_subnetmask%]==[] set /p system_subnetmask=255.255.255.0
set /p SystemGateway="Enter the System Default Gateway[127.*.*.*]:"
echo "Aviliable Ethernet Interface :"
netsh interface show interface
set /p EthernetInterfaceName="Type the Ethernet Interface Name:"
netsh interface ip set address %EthernetInterfaceName% static %SystemIP% %SystemSubnetMask% %SystemGateway%
netsh interface ip set dns %EthernetInterfaceName% static 8.8.8.8
netsh interface ip add dnsserver %EthernetInterfaceName% address=4.2.2.2 index=1
Antwort1
„Wie protokolliere ich die Zugriffsberechtigung nach der Gewährung des Zugriffs im Batch-Skript?“
- DerVerknüpfungbeantwortet dies in Ihrer Frage auf vielfältige Weise.
„Ich habe die vorgeschlagene Lösung in den unten stehenden Link eingegeben, aber sie funktioniert nur, wenn unser Batch-Skript keinen Administratorzugriff anfordert …
- Einige Änderungen/Bearbeitungen in Ihrem Code sind notwendig, einschließlich solcher, die folgendes nutzen:vbs, und die den Mechanismus der Anforderung von Administratorrechten beeinträchtigen."
„… oder beliebige Benutzereingaben entgegennehmen.“
- Diese Aktionen in Ihrem Code, die Eingaben empfangen, erfolgen nach der Aktion zum Erhalten von Administratorrechten (durch VBS). Wenn also die vorherige Aktion nicht erfolgt, erfolgt auch diese nicht.
Ohne zu sehr ins Detail zu gehen: Ihr Ziel besteht darin, die Protokolle der Ausführungen Ihrer im Stapel aufgelisteten Befehle zu erhalten. Bei diesem Versuch lassen Sie jedoch die Ausgaben auf dem Bildschirm aus, weil Sie die Umleitung zu einer Protokolldatei verwenden, ohne jedoch zu erkennen, dass der Bildschirm (stdout) keine Befehlsausgaben aufweist, sondern sogar lahmgelegt wird und auf set /p
Befehlseingaben wartet.
Dadurch wird Ihr laufender Code nicht unbedingt unterbrochen, aber er „hängt“ definitiv, ohne dass eine Meldung auf dem Bildschirm angezeigt wird, und bleibt dort, während er auf die Fortsetzung der Benutzer-/Administratorinteraktion wartet, was jedoch nie geschieht.
Ich würde daher Änderungen vorschlagen, bei denen die für die Registrierung erforderlichen Aktionen von den Aktionen getrennt würden, die zum Empfang von Interaktion/Eingabe erforderlich sind:
@echo off
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" && goto :gotAdmin
echo/Requesting administrative privileges... & goto :UACPrompt
:UACPrompt
set "_params=" & if not "%*" == "" =;(
set "_params=%*"
call set "_params=%%_params:"=%%"
);=
> "%temp%\getadmin.vbs" =;(
echo/Set UAC = CreateObject("Shell.Application"^)
echo/UAC.ShellExecute "%ComSpec%", "/c %~s0 %_params%", "", "runas", 1
);= && "C:\Windows\System32\cscript.exe" //Nologo "%temp%\getadmin.vbs"
>nul 2>&1 del /q "%temp%\getadmin.vbs" & exit /b || goto :eOf
:gotAdmin
cd /d "%~dp0"
set "_LogFile=%temp%\batch.log"
echo/Set IP address to USB Ethernet :
set /p "_SystemIP=Enter the System IP address [127.*.*.*]: "
set /p "_SystemSubnetMask=Enter the System Subnet Mask [Default: 255.255.255.0]: "
if "%_SystemSubnetMask%" == "" set "_System_SubnetMask=255.255.255.0"
set /p "_SystemGateway=Enter the System Default Gateway [127.*.*.*]: "
echo/Aviliable Ethernet Interface:
"C:\Windows\System32\netsh.exe" interface show interface | findstr .
set /p "_EthernetInterfaceName=Type the Ethernet Interface Name: "
:: logging commands after defined in/with admin inputs
:: ----------------------------------------------------
for %%i in (EthernetInterfaceName,SystemIP, SystemSubnetMask, SystemGateway
)do "%ComSpec%" /v:on /e:on /c "echo/%%~i: !_%%~i!"
2>&1 =;(
netsh interface show interface | findstr .
for %%i in (EthernetInterfaceName,SystemIP, SystemSubnetMask, SystemGateway)do "%ComSpec%" /v:on /e:on /c "echo/%%~i: !_%%~i!"
echo\ "C:\Windows\System32\netsh.exe" interface ip set address %_EthernetInterfaceName% static %_SystemIP% %_SystemSubnetMask% %_SystemGateway%
echo\ "C:\Windows\System32\netsh.exe" interface ip set dns %_EthernetInterfaceName% static 8.8.8.8
echo\ "C:\Windows\System32\netsh.exe" interface ip add dnsserver %_EthernetInterfaceName% address=4.2.2.2 index=1
echo\ "C:\Windows\System32\ipconfig.exe" /flushdns
);= >"%_LogFile%"
type "%_LogFile%" | clip
"C:\Windows\System32\timeout.exe" -1
- Warum?
Obwohl es möglich ist, umzuleitenstderr
Zustdout
ist es auch möglich, umzuleitenstderr
Undstdout
gleichzeitig ist eine Umleitung nicht möglichstdin
(set /P
)Zustdout
in eine Datei und haben gleichzeitigstdout
auf dem Bildschirm empfangenstdin
Und Ihre Frage weist auf dieses Ziel hin.
Zeigerstream
stdin Standard input
stderr Standard error
stdout Standard output
Redirection:
stderr <to> Null <use> 2>Nul
stderr <to> stdout <use> 2>&1
stderr <to> File.Log <use> 2>File.Log
stdout <to> Null <use> >Nul
stdout <to> Null <use> 1>Nul
stdout <to> File.Log <use> >File.Log
stdout <to> File.Log <use> 1>File.Log
Redirection stdout and stderr to File.Log:
2>&1 YourCommandHere >File.Log
2>&1 YourCommandHere 1>File.Log
Set IP address to USB Ethernet :
Enter the System IP address [127.*.*.*]: //user input [stdin]
Enter the System Subnet Mask [Default: 255.255.255.0]: //user input [stdin]
Enter the System Default Gateway [127.*.*.*]: //user input [stdin]
Avaliable Ethernet Interface:
Admin State. State Type Interface Name
-------------------------------------------------------------------------
Enable Conected Dedicaed Wi-Fi
Type the Ethernet Interface Name: //user input [stdin]
Zusätzliche Ressourcen: