【问题标题】:List all file parameters in directory recursively using forfiles in for loop使用for循环中的forfiles递归列出目录中的所有文件参数
【发布时间】:2019-06-15 23:02:56
【问题描述】:

我正在尝试以递归方式列出文件夹中的所有文件及其参数,以列出目录/子目录中大小超过 10000 字节且未修改超过 30 天的所有文件。问题是下面的代码卡住了,没有输出。

   @echo on


SET Path1=Z:\Server_P8BE890914E369FBB6FBD0C91748F8B19
 break > Z:\FilestobeDeleted.txt
ECHO FILE RAN %date:~10%/%date:~4,2%/%date:~7,2% >>%CDID%\FilestobeDeleted.txt
echo FileName                       Size        Path           Date            Time >>Z:\FilestobeDeleted.txt
for /f "skip=1 tokens=1,2,3,4,5* delims=,] " %%i in ('forfiles /p %Path1% /s /m *.* /c "cmd /c if @fsize gtr 10000 echo @fsize @file @path @fdate @ftime" /d -30') do ( 
set FILE_SIZE_WINDOWS=%%i
set FILE_NAME=%%j
set FILE_PATH=%%k
set FILE_DATE=%%l
set FILE_TIME=%%m
set "unit=B"
for %%b in (KB MB GB TB PB EB ZB YB) do if 1024 lss !FILE_SIZE_WINDOWS! (
set "unit=%%b"
if  !FILE_SIZE_WINDOWS! lss 2147483647 (set /a "FILE_SIZE_WINDOWS=FILE_SIZE_WINDOWS/1024") else (set "FILE_SIZE_WINDOWS=!FILE_SIZE_WINDOWS:~0,-3!")
)

 echo !FILE_NAME! !FILE_SIZE_WINDOWS!!unit! !FILE_PATH! !FILE_DATE! !FILE_TIME! >>Z:\FilestobeDeleted.txt

 )
echo Done

【问题讨论】:

  • 我假设你在脚本前面已经SetLocal EnableDelayedExpansion 了?
  • 是的,你是对的。我删除了它,但仍然没有运气。更新了上面的整个代码。
  • 所以我又等了几分钟,文件中的输出是 FILE RAN 2019/06/15 FileName Size Path Date Time !FILE_NAME! !FILE_SIZE_WINDOWS!!单位! !文件路径! !FILE_DATE! !FILE_TIME!多次使用相同的行
  • 那么,我再问同样的问题!
  • 仅供参考,您的问题是10000 bytes,您在上面的评论是more than 1 MB,而1MB 是1048576bytes(可能是1000000)。修复该问题应该会减少您的文件数量,但Set /A 仅适用于 32 位整数,这意味着它可能无法计算您的绝大多数文件大小的大小。因此,我的建议是为您的任务寻找替代解决方案,可能是基于 powershell 的解决方案。

标签: batch-file command


【解决方案1】:

这是一个示例 解决方案,它尝试在 Z:\FilestobeDeleted.txt 中列出源目录及其子目录中大于或等于1MB,最后一次修改是在30 天前。它使用 switch 语句为这些尺寸分配适当的单位,并将每个尺寸四舍五入到最多两位小数。

Function Convert-BytesToHighest {
    [CmdletBinding()]
    Param([Parameter(Mandatory=$False,Position=0)][Int64]$Size)

    Switch ($Size) {
        {$Size -GT 1PB} {$NewSize="$([Math]::Round(($Size/1PB),2))PB";Break}
        {$Size -GT 1TB} {$NewSize="$([Math]::Round(($Size/1TB),2))TB";Break}
        {$Size -GT 1GB} {$NewSize="$([Math]::Round(($Size/1GB),2))GB";Break}
        {$Size -GT 1MB} {$NewSize="$([Math]::Round(($Size/1MB),2))MB";Break}
        {$Size -GT 1KB} {$NewSize="$([Math]::Round(($Size/1KB),2))KB";Break}
        Default {$NewSize = "$([Math]::Round($Size,2))Bytes";Break}
    }

    Return $NewSize
}

Get-ChildItem -Path "Z:\Server_P8BE890914E369FBB6FBD0C91748F8B19" -Recurse -Force -ErrorAction SilentlyContinue |
Where-Object {
    (! $_.PSIsContainer) -And ($_.Length -GE 1048576) -And ($_.LastwriteTime -LT (Get-Date).AddDays(-30))
} |
Format-Table Name,@{Expression={Convert-BytesToHighest $_.Length};Label="Size"},FullName,LastWriteTime -AutoSize |
Out-File -FilePath "Z:\FilestobeDeleted.txt" -Width 512

您应该可以像这样从 或 运行它:

PowerShell -ExecutionPolicy RemoteSigned -File "MyScript.ps1"

如果您发现某些信息由于文件路径过长而被截断,您可以根据需要增加Width 的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2014-09-07
    • 2010-10-19
    相关资源
    最近更新 更多