Пакетный режим: поиск файлов с определенным расширением, владельцем, полным путем и последним доступом для записи и выводом в CSV
Я пытаюсь создать CSV с полным путем \ именем файла, владельцем файла и последним доступом для записи (дата изменения) всех файлов txt и html со всех жестких дисков сервера данных.
Вот что я получил так далеко:
set pgm=%~n0
set log=%~dpn0.log
set host=%COMPUTERNAME%
set csv=%host%.csv
set dir=D:\BME
if not exist "%csv%" type nul>"%csv%"
for /f "delims=;" %%a in ('dir /b/s %dir%\*.txt, %dir%\*.html') do (
>>%csv% echo "%%a"
)
Это выводит путь + имя файла всех найденных txt и html файлов определенной папки в CSV. Я попробовал эту команду, чтобы получить жесткие диски:
wmic logicaldisk where drivetype=3 get caption
Но я не могу понять, как сохранить это в переменной или файле и перебрать его, а также получить владельца и дату последнего изменения и поместить его в новый столбец файла csv.
2 ответа
Я не могу понять, как сохранить это в переменной
Используйте следующий пакетный файл.
GetDrives.cmd:
@echo off
setlocal enabledelayedexpansion
rem skip=1 to remove the header
rem findstr to remove blank lines
for /f "skip=1" %%d in ('wmic logicaldisk where drivetype^=3 get caption ^| findstr /r /v "^$"') do (
set _drive=%%d
echo !_drive!
)
endlocal
Заметки:
- Будьте осторожны при использовании
drivetype=3
как у меня съемный диск типа3
, В выводе нижеC:
это фиксированный жесткий диск иF:
это съемный внешний USB-накопитель. - замещать
echo !_drive!
в соответствии с измененной версией существующего кода.
Пример вывода:
F:\test>GetDrives
C:
F:
F:\test>
Дальнейшее чтение
- Индекс AZ командной строки Windows CMD - Отличный справочник по всем вопросам, связанным с командной строкой Windows.
- enabledelayedexpansion - отложенное расширение приведет к тому, что переменные будут расширяться во время выполнения, а не во время разбора.
- for / f - Циклическая команда против результатов другой команды.
- wmic - команда инструментария управления Windows.
DavidPostill ответил, как-магазин wmic logicaldisk …
вывод в переменную;
- чтобы получить дату последней модификации файла: используйте
echo "%%a","%%~ta"
в вашем скрипте, используя%~t
Расширение параметра; - чтобы получить владельца файла:
echo "%%a","%%~ta","!_owner!"
где_owner
переменная происходит отgetRealOwner
подпрограмма, основанная на измененном ответе schletti2000 Получить информацию о владельце из командной строки, используяwmic
,
Сценарий:
@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion
set "pgm=%~n0"
set "log=%~dpn0.log"
set "host=%COMPUTERNAME%"
set "csv=%host%.csv"
set "dir=D:\BME"
set "dirmask=%dir%\*.txt, %dir%\*.html"
rem if not exist "%csv%" type nul>"%csv%"
>"%csv%" (
for /f "delims=;" %%a in ('dir /b/s %dirmask% 2^>NUL') do (
set "_fFullPath=%%~a"
set "_fLastWrite=%%~ta"
set "_fOwner="
call :getRealOwner
SETLOCAL EnableDelayedExpansion
echo "!_fFullPath!","!_fOwner!","!_fLastWrite!"
ENDLOCAL
)
)
)
type "%csv%"
goto :continue
:getRealOwner
SET "ESCAPED=%_fFullPath:\=\\%"
SET "UNDELIMITED="
for /F "skip=2 delims=" %%g in ('
wmic path Win32_LogicalFileSecuritySetting where Path^="%ESCAPED%" ^
ASSOC /RESULTROLE:Owner /ASSOCCLASS:Win32_LogicalFileOwner ^
/RESULTCLASS:Win32_SID 2^>NUL
') do (
SET "UNDELIMITED=%%g"
call :process_wmioutput
)
if NOT defined UNDELIMITED set "_fOwner=???"
exit /B
:process_wmioutput
SET "DELIMITED=%UNDELIMITED: =•%"
FOR /F "delims=• tokens=10,12" %%G in ("%DELIMITED%") DO set "_fOwner=%%H\%%G"
exit /B
:continue
Я использовал следующие настройки, чтобы продемонстрировать различные результаты:
set "dir=D:"
set "dirmask=%dir%\loc*.vbs %dir%\bcd*.log %dir%\act*.xsl %dir%\diag*.xml %dir%\chec*.csv"
Выход - непривилегированный cmd
окно:
==> D:\bat\SO\39034430.bat
"D:\odds and ends\tempx\links\testDJ\LocUsers.vbs","mypc\user","25.12.2014 00:13"
"D:\tempWin\ActivityLog.xsl","NT AUTHORITY\SYSTEM","24.02.2016 13:12"
"D:\tempWin\CompatTelemetryLogs\diagerr.xml","???","12.08.2015 03:17"
"D:\tempWin\CompatTelemetryLogs\diagwrn.xml","???","12.08.2015 03:17"
"D:\test\check_acl.csv","BUILTIN\Administrators","06.03.2016 14:28"
Выход - привилегированный (запуск от имени администратора) cmd
окно:
=ADMIN=> D:\bat\SO\39034430.bat
"D:\odds and ends\tempx\links\testDJ\LocUsers.vbs","mypc\user","25.12.2014 00:13"
"D:\tempWin\ActivityLog.xsl","NT AUTHORITY\SYSTEM","24.02.2016 13:12"
"D:\tempWin\CompatTelemetryLogs\diagerr.xml","NT AUTHORITY\SYSTEM","12.08.2015 03:17"
"D:\tempWin\CompatTelemetryLogs\diagwrn.xml","NT AUTHORITY\SYSTEM","12.08.2015 03:17"
"D:\test\check_acl.csv","BUILTIN\Administrators","06.03.2016 14:28"