Пакетный режим: поиск файлов с определенным расширением, владельцем, полным путем и последним доступом для записи и выводом в 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 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"
Другие вопросы по тегам