![- Почему?](https://rvso.com/image/1692552/-%20%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83%3F.png)
Я напечатал предлагаемое решение вЗаписать весь вывод пакетного файла.
Но работает только тогда, когда пакетный скрипт не запрашивает права администратора и не принимает никаких данных от пользователя.
В моем скрипте я беру административный доступ, а также пользовательский ввод:
@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
решение1
«Как вести журнал после получения доступа в пакетном скрипте?»
- Theсвязьв вашем вопросе ответы на это самые разные.
«Я ввел предлагаемое решение по ссылке ниже, но оно работает только тогда, когда пакетный скрипт не запрашивает права администратора...
- Необходимо внести некоторые изменения/редактирование в ваш код, включая те, которые используютвбс, и это мешает механизму запроса прав администратора».
«... или принять любой пользовательский ввод».
- Эти действия в вашем коде, которые будут получать входные данные, находятся после действия получения прав администратора (через VBS), поэтому, если предыдущее не произошло, это тоже не произойдет.
Не вдаваясь в подробности, ваша цель заключается в получении журналов выполнения ваших команд, перечисленных в пакетном режиме, но, пытаясь сделать это, вы пропускаете выходные данные с экрана, поскольку используете перенаправление в файл журнала, однако, не осознавая, что на экране (stdout) не будет никаких выходных данных команд, он даже остановится и будет ждать set /p
ввода команд.
Это не обязательно нарушит работу вашего кода, но он определенно «зависнет», не отображая никаких сообщений на экране, и останется там, ожидая продолжения взаимодействия пользователя/администратора, чего никогда не происходит.
Тогда я предлагаю внести изменения, в которых действия, необходимые для регистрации, будут разделены от действий, необходимых для получения взаимодействия/ввода:
@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
- Почему?
Хотя возможно перенаправлениеstderr
кstdout
, также возможно перенаправлениеstderr
иstdout
одновременно, что невозможно, так это перенаправлениеstdin
(set /P
)кstdout
в файл и одновременно иметьstdout
на экране приемstdin
. И ваш вопрос указывает на эту цель.
Поток указателя
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]
Дополнительные ресурсы: