使用 forfiles 以十六进制获取文件大小

Get File size in hex using forfiles

我在 CMD 中使用此命令获取目录中的所有文件大小。

forfiles /s /c "cmd /c echo @file @fsize" >filelist.txt

有办法采用这种大小但采用十六进制格式?

示例:

"00000000.png" 219457

"00000000.png" 50A6E

虽然这不使用 FORFILES,但可以在 windows cmd batch-file 中使用。由于这是递归搜索,我假设您希望包含完全限定路径以避免在多个目录中使用相同文件名时出现问题。

powershell -NoLogo -NoProfile -Command ^
    "$q='\"';Get-ChildItem -File -Recurse ^| ForEach-Object {$($q+$_.FullName+$q) + ' ' + $($_.Length.ToString('X'))}"

嗯,forfiles当然不支持十进制转十六进制了

本机不支持在纯传统批处理脚本中转换数字,因此您将不得不借用另一种语言(如 PowerShell、VBScript、JavaScript,所有这些都随现代 Windows 系统),或者自己用困难的方式编写代码(一步一步,就像在纸上做一样)。

无论如何,幸运的是有一个隐藏的和未记录的动态伪变量叫做=ExitCode, which holds the hexadecimal value of the most recent exit code,我们可以利用它:

rem // Iterate through all files in the current working directory:
for /R %%I in (*.*) do (
    rem // Store name of currently iterated item:
    set "ITEM=%%~I"
    rem // Toggle delayed expansion to avoid issues with `!` and `^`:
    setlocal EnableDelayedExpansion
    rem // Explicitly set exit code to the size of the current file:
    cmd /C exit 0%%~zI
    rem // Return the exit code, hence the file size, as hex number:
    echo(!ITEM!  !=ExitCode!
    endlocal
)

请注意,文件大小必须小于 2 GiB,因为退出代码以带符号的 32 位整数形式给出。