- Почему?

- Почему?

Я напечатал предлагаемое решение вЗаписать весь вывод пакетного файла.

Но работает только тогда, когда пакетный скрипт не запрашивает права администратора и не принимает никаких данных от пользователя.

В моем скрипте я беру административный доступ, а также пользовательский ввод:

@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, stdout и stderr являются стандартными потоками для ввода, вывода и вывода ошибок.

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]

Дополнительные ресурсы:

Связанный контент