批量:搜索具有特定扩展名、所有者、完整路径和最后写入权限的文件,并以 CSV 格式输出

Batch: search for files with certain extension, owner, fullpath and last write access and output in CSV

我正在尝试使用数据服务器所有硬盘驱动器中所有 txt 和 html 文件的 fullpath\filename、文件所有者和上次写入访问权限(修改日期)创建 CSV。

这是我目前得到的结果:

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文件的路径+文件名和CSV中某个文件夹的html文件。我试过这个命令来获取硬盘:

wmic logicaldisk where drivetype=3 get caption

但我无法理解如何将其存储在变量或文件中并循环遍历它,还检索所有者和最后修改日期并将其放入 csv 文件的新列中。

我不知道如何将它存储在变量中

使用以下批处理文件。

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>

进一步阅读

DavidPostill answered ;

脚本:

@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 window:

==> D:\bat\SO034430.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 window:

=ADMIN=> D:\bat\SO034430.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"