用于生成包含子文件夹名称和每个用户w.r.t的特定日志文件大小的csv文件的批处理脚本

时间:2014-11-25 20:14:29

标签: batch-file

我有一个名为Folder1的文件夹。 Inside Folder1中有一些子文件夹(a,b,c,d,e ...)在每个子文件夹中,所有子文件夹(test.log)中都有一个同名的日志文件。每个日志文件的大小都不同。我需要生成一个csv文件,其中包含每个用户w.r.t特定日志文件的子文件夹名称和大小。

例如:我的输出应该是

180

b 220

c 450

我尝试在Google上搜索代码。

@ECHO OFF
SetLocal EnableDelayedExpansion

rem To put the sub-folder names inside the Folder1 into a text file try.txt

pushd C:\....\Folder1\*
for /f "delims=" %%f in ('dir /b /ad') do echo %%f >> try.txt
popd


rem To put the values inside a text file(try.txt) into a variable %Build% (but the values are place horizontally with spaces; it is not inserting vertically) 

pushd C:\....\Folder1\try.txt\*
for /f "delims=" %%f in (try.txt) do set Build=!Build!%%f
popd

echo %Build%'\n' >> bb.log

我的想法是将子文件夹名称放在名为try.txt的文本文件中,并将文本文件中的值放入可变的%Build%中。然后转到日志文件所在的路径以获取大小。如下。

 for /f %%i in ("C:\....\Folder1\%Build%\....\test.log") do set "size=%%~zi" >> output.csv

请帮助我,因为我是批处理脚本的新手。

如果条件如下所示,如何修改相同的脚本。

C:\Users\<username>\AppData\Roaming\sys.log 

where my output should be:

<username1> sys.log file size (for each usernames under C:\Users) 
<username2> sys.log file size
<username3> sys.log file size

2 个答案:

答案 0 :(得分:1)

我认为以下内容应该有效:

@echo off
setlocal enabledelayedexpansion

if "%~1" equ "" (echo %~0: error: missing base directory.& exit /b 1)

set files=
for /f "delims=" %%i in ('dir /b "%~1\*"') do set files=!files! %~1\%%i\test.log
for %%i in (!files!) do echo %%i,%%~zi

exit /b 0

我已经在第一个参数上参数化了基本目录,因此您可以按如下方式调用它,假设您已将脚本保存为size.bat,位于Folder1上方的目录中:

size.bat Folder1

更新:让我知道这是否有效:

@echo off
setlocal enabledelayedexpansion

if "%~1" equ "" (echo %~0: error: missing prefix.& exit /b 1)
if "%~2" equ "" (echo %~0: error: missing suffix.& exit /b 1)

for /f "delims=" %%i in ('dir /b "%~1\*"') do (
    set infix=%%~i
    set file=%~1\!infix!\%~2
    for %%j in ("!file!") do set size=%%~zj
    echo !infix!,%~nx2,!size!
)

exit /b 0

我现在也对后缀进行了参数化,并重新设计了第一个(现在只有)for循环以完全处理每个文件,然后再转到下一个文件,而不是构建一个以空格分隔的文件列表。这种新设计的优点是应该正确处理路径名(前缀,后缀或中缀)中的空格。

您可以按如下方式调用此新脚本:

size.bat C:\Users AppData\Roaming\sys.log

答案 1 :(得分:1)

我只想介绍一种使用Powershell的不同方法。

# Easy way
dir C:\Users\*\AppData\Roaming\sys.log | Select-Object Fullname, Length

# What you asked for
dir c:\users | ForEach-Object{ $_.name + " " +  (dir "$_\AppData\Roaming\sys.log").Length  }

如果您刚刚开始使用批处理文件,请花一点时间来探索PowerShell。这个例子对批处理文件来说并不算太糟糕。但是我看到你将数据转储到文件中只是为了在以后的命令中处理。我认为你会发现powershell处理对象和枚举事物集合的方式很有价值。