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