根据文件名的长度回显x个点数

时间:2014-12-31 01:39:14

标签: batch-file count filenames variable-length

我正试图找到一种方法来根据文件名的长度回显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上找到的脚本来计算文件名的长度。我不确定我是否可以使用“反击”来支持。

提前致谢! :)

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

遍历目录中的所有文件以查找最长的文件。然后添加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

答案 2 :(得分:0)

正如用户“Jeb”所述,没有本地方法可以获得字符串的长度。你必须写自己的: How do you get the string length in a batch file?

请同时参考此问题循环批处理文件: Batch script loop