批量:搜索具有特定扩展名、所有者、完整路径和最后写入权限的文件,并以 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>
进一步阅读
- An A-Z Index of the Windows CMD command line - 所有与 Windows cmd 行相关的内容的绝佳参考。
- enabledelayedexpansion - 延迟扩展将导致变量在执行时而不是在解析时扩展。
- for /f - 根据另一个命令的结果循环命令。
- wmic - Windows 管理规范命令。
DavidPostill answered ;
- 检索文件最后修改日期:在您的脚本中使用
echo "%%a","%%~ta"
使用 %~t
Parameter Extension;
- 检索文件所有者:
echo "%%a","%%~ta","!_owner!"
其中 _owner
变量来自 getRealOwner
子程序,基于修改后的 schletti2000's answer Get ownership information from command line by using 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
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"
我正在尝试使用数据服务器所有硬盘驱动器中所有 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>
进一步阅读
- An A-Z Index of the Windows CMD command line - 所有与 Windows cmd 行相关的内容的绝佳参考。
- enabledelayedexpansion - 延迟扩展将导致变量在执行时而不是在解析时扩展。
- for /f - 根据另一个命令的结果循环命令。
- wmic - Windows 管理规范命令。
DavidPostill answered
- 检索文件最后修改日期:在您的脚本中使用
echo "%%a","%%~ta"
使用%~t
Parameter Extension; - 检索文件所有者:
echo "%%a","%%~ta","!_owner!"
其中_owner
变量来自getRealOwner
子程序,基于修改后的 schletti2000's answer Get ownership information from command line by usingwmic
.
脚本:
@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"