0

我正在尝试找到一种方法来根据文件名的长度回显 x 个点。

在我正在制作的批处理脚本中,有一部分是 ECHO 的文件名和文件大小。

问题是没有一个文件名具有相同数量的字符。

45545.ext.................8.23 MB
12341231.ext..............5.87 MB
543646767676.ext..........6.23 MB
34563456345634563.ext.....3.87 MB

假设我想在最长的文件名后面加上 5 个点,那么我需要在较短的文件名后面加上 X 个点来获取同一行中文件的大小,如上所示。

我尝试使用在 StackOverflow 上找到的计算文件名长度的脚本。我不确定我是否可以对此使用“计数器”。

提前致谢!:)

4

3 回答 3

2

这是用句点填充文件名右侧的简单方法。
您确实必须满足最大长度的文件名,因此请更改80以下内容。

@echo off
setlocal enabledelayedexpansion
set "line="
for /L %%a in (1,1,1000) do set line=!line!.
for %%a in (*) do (
   set "var=%%a%line%"
   echo !var:~0,80!  %%~za
)
pause
于 2014-12-31T02:45:59.283 回答
1

您可以使用带有for /l循环的可变子字符串来确定字符串的长度。继续循环,直到文件名的x个字符等于文件,然后你就找到了你的长度。

遍历目录中的所有文件以查找最长的文件。然后添加 5 以确保最长的文件仍然有 5 个点。然后对于目录中的每个文件,该数字减去长度就是您需要的点数。

易榨柠檬汁。

@echo off
setlocal enabledelayedexpansion

:: get longest filename in directory
set longest=0
for %%I in (*) do (
    call :length "%%~I" len
    if !len! gtr !longest! set longest=!len!
)

:: Dot fill each line
for %%I in (*) do (
    call :length "%%~I" len
    set /a dots=%longest% + 5 - len
    <NUL set /P "=%%~I"
    call :dots !dots!
    echo %%~zI bytes
)

:: end main script
goto :EOF

:length <filename> <var_to_set>
setlocal enabledelayedexpansion
set "tmpfile=%~1"
for /l %%I in (1,1,100) do (
    if "!tmpfile!"=="!tmpfile:~-%%I!" (
        endlocal && set "%~2=%%I"
        goto :EOF
    )
)

:dots <number_of_dots>
setlocal
for /l %%I in (1, 1, %~1) do <NUL set /P "=."
goto :EOF

注意:此脚本假定您的文件名不会超过 100 个字符。如果可以,那么在子程序100中增加for /l循环中的。:length

如果您想要一个速度优化的:dots子例程,请将脚本的最后四行替换为以下内容:

:dots <number_of_dots>
setlocal enabledelayedexpansion
set "dots=...................................................................................................."
<NUL set /P "=!dots:~-%1!"
goto :EOF
于 2014-12-31T02:04:21.863 回答
0

正如用户“Jeb”所说,没有本地方法可以获取字符串的长度。您必须自己编写: 如何获取批处理文件中的字符串长度?

另请参阅此问题以在批处理文件中循环: 批处理脚本循环

于 2014-12-31T01:45:19.857 回答