Пакетный скрипт, который печатает дату на экране, но должен быть перенаправлен в файл - PullRequest
1 голос
/ 20 сентября 2019

Я написал простой пакетный скрипт, который перенаправляет вывод команды в файл, однако я все еще вижу вывод даты на экране терминала.Каждая функция начинается с двоеточия, двойные двоеточия - это комментарии.В конце скрипта я вызываю каждую функцию и, наконец, использую встроенную команду паузы.Кто-нибудь знает, почему я вижу только один вывод даты?

@echo off
::navigate to correct folder
cd C:\TimsFolder2

::verify directories are created
if exist C:\TimsFolder2\compInfo (ECHO TimsFolder2 is present)^
 Else (mkdir compInfo && echo "TimsFolder2^\compInfo directory created") 
if exist C:\TimsFolder2\groupInfo (ECHO TimsFolder2 is present)^
 Else (mkdir groupInfo && echo TimsFolder2^\groupInfo created) 
if exist C:\TimsFolder2\networkInfo (ECHO TimsFolder2 is present)^
 Else (mkdir networkInfo && echo TimsFolder2^\networkInfo created) 
if exist C:\TimsFolder2\userInfo (ECHO TimsFolder2 is present)^
 Else (mkdir userInfo && echo TimsFolder2^\userInfo) 

::system Info Function
:sysInfo
date /t && time /T > C:\TimsFolder2\compInfo\compInfo.txt
ver >> C:\TimsFolder2\compInfo\compInfo.txt
fsutil fsinfo drives >> C:\TimsFolder2\compInfo\compInfo.txt
wmic OS get /format:list >> C:\TimsFolder2\compInfo\compInfo.txt
wmic BIOS get /format:list >> C:\TimsFolder2\compInfo\compInfo.txt
wmic BOOTCONFIG get /format:list >> C:\TimsFolder2\compInfo\compInfo.txt
wmic CPU get /format:list >> C:\TimsFolder2\compInfo\compInfo.txt
wmic memphysical get /format:list >> C:\TimsFolder2\compInfo\compInfo.txt
EXIT /B 0

::User Info Function
:userInfo
date /t && time /T > C:\TimsFolder2\userInfo\userInfo.txt
hostname >> C:\TimsFolder2\userInfo\userInfo\userInfo.txt
whoami >> C:\TimsFolder2\userInfo\userInfo.txt
EXIT /B 0

::Group Info Function
:groupInfo
date /t && time /T > C:\TimsFolder2\groupInfo\groupInfo.txt
net users >> C:\TimsFolder2\groupInfo\groupInfo.txt 
net accounts >> C:\TimsFolder2\groupInfo\groupInfo.txt
gpresult /R >> C:\TimsFolder2\groupInfo\groupInfo.txt
EXIT /B 0

::NetworkInfo Info Function
:networkInfo
date /t && time /T > C:\TimsFolder2\networkInfo\networkInfo.txt
route print >> C:\TimsFolder2\networkInfo\networkInfo.txt
netsh interface ipv4 show addresses >> 
C:\TimsFolder2\networkInfo\networkInfo.txt
getmac >> C:\TimsFolder2\networkInfo\networkInfo.txt
arp -a >> C:\TimsFolder2\networkInfo\networkInfo.txt
EXIT /B 0

::File System
:fileSystem
cd C:\TimsFolder2
forfiles
EXIT /B 0

call : sysInfo
call : userInfo
call : groupInfo
call : networkInfo
call : fileSystem

pause

Вывод пакетного сценария

Ответы [ 3 ]

2 голосов
/ 20 сентября 2019

Помимо вопроса, Герхард уже ответил, у вас есть еще две проблемы:

Первый:

call : sysInfo

пытается вызвать подпрограмму без имени : (что даст вамсинтаксическая ошибка) с параметром sysInfo.Не то, что вы хотите.Вы хотите:

call :sysInfo

Секунда:

Пакет не имеет такого понятия как функция (как в других / истинных языках).Код просто запускается построчно (за исключением того, что есть GOTO (который переходит на соответствующую метку) или CALL (который запоминает, откуда он приходит, а затем переходит на соответствующую метку и возвращается только в том случае, если он достигаетпоследняя строка скрипта или GOTO :eof (что по сути означает «перейти к самому концу скрипта»)).

Так что вам нужно «закрыть» каждую из ваших «функций» (лично мне нравитсятермин «подпрограмма» лучше, но технически они оба неверны) с goto :eof (что вы уже сделали) и добавьте еще одну goto :eof перед первой подпрограммой, чтобы код не выполнял следующую подпрограмму(помните: построчно) после «основного кода» (когда ожидается его остановка) (*which you forgot*).

1 голос
/ 20 сентября 2019

Проблема в том, что ваши команды разделены &&.В этом случае первый не имеет перенаправления в файл, только второй, так что на самом деле происходит следующее:

date /T
&&
time /T>output.txt

Где вы действительно хотели:

(date /T && time /T)>output.txt

Проблема здесьэто две разные команды, поэтому они будут помещены в две отдельные строки:

2019/09/20
2:22:23 PM

Вместо этого выполните:

echo %date% %time%>C:\TimsFolder2\networkInfo\networkInfo.txt

Тем не менее, для вывода многих вещей в один файлэто даже чище:

(echo %date% %time%
net users
net accounts
) >> C:\TimsFolder2\groupInfo\groupInfo.txt

Так что все в вашем файле может быть переписано так, вот некоторые из них в качестве демонстрации:

....
.....
:sysInfo
(date /t && time /T
 ver
 fsutil fsinfo drives
 wmic OS get /format:list
 wmic BIOS get /format:list
 wmic BOOTCONFIG get /format:list
 wmic CPU get /format:list
 wmic memphysical get /format:list
)> C:\TimsFolder2\compInfo\compInfo.txt
EXIT /B 0

::User Info Function
:userInfo
(echo %date% %time%
 hostnam
 whoami
)> C:\TimsFolder2\userInfo\userInfo.txt
....
...
0 голосов
/ 20 сентября 2019

Я решил опубликовать этот переписанный, но еще не проверенный пример того, как я мог бы попытаться это сделать:

@Echo Off
CD /D "C:\TimsFolder2" 2>NUL||Exit /B
For %%A In (compInfo,groupInfo,networkInfo,userInfo) Do (If Exist "%%~A\" (
    Echo %%~A is present) Else MD "%%~A" && Echo %%~A directory created
  Call :%%A>>"%%A\%%A.txt")

:fileSystem
Forfiles

Pause
GoTo :EOF

:compInfo
Date /T
Time /T
Ver
FSUtil FSInfo Drives
WMIC OS Get /Format:List
WMIC BIOS Get /Format:List
WMIC BootConfig Get /Format:List
WMIC CPU Get /Format:List
WMIC MemPhysical Get /Format:List
Exit /B 0

:userInfo
Date /T
Time /T
HostName
WhoAmI
Exit /B 0

:groupInfo
Date /T
Time /T
Net Users
Net Accounts
GPResult /R
Exit /B 0

:networkInfo
Date /T
Time /T
Route Print
NetSh Interface IPv4 Show Addresses
GetMAC
ARP /A
Exit /B 0

Я не проверял и не проверял информацию, указанную под каждой из ваших Call отредактированных этикеток, хотя язаметил внизу ForFiles, что я сомневаюсь, что сам по себе на самом деле будет много выводить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...