【问题标题】:Echo x number of dots based on the length of the file name回显 x 基于文件名长度的点数
【发布时间】:2014-12-31 01:39:14
【问题描述】:

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

提前致谢! :)

【问题讨论】:

  • 只是出于好奇,您找到的计算文件名长度的脚本在哪里?
  • 啊。好吧,随意用你自己的替换我的:length 函数。 :) 我的回答至少应该证明确定需要多少点的逻辑。
  • 好的 :) 非常感谢您的回答!我要试试看:)
  • 我刚刚运行了一些测试,对于包含 35 个文件的目录,我的 for /l 循环比您链接的方法快 150 毫秒。 jeb 的方法快了大约 40 毫秒,但由于某种原因不起作用(尽管逻辑看起来很合理)。 foxidrive 下面的答案大约快 4 倍,但不会根据最长的文件名长度计算任何点填充变化。

标签: batch-file count filenames variable-length


【解决方案1】:

这是一种用句点填充文件名右侧的简单方法。
您必须满足最大长度的文件名,因此请更改下面的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

【讨论】:

  • 谢谢,这也很好!但是有没有办法使用特殊字符,如 Æ,Ø,Å,æ,ø,å,è?编辑:没关系,我刚刚添加了chcp 1252 :)
【解决方案2】:

您可以使用带有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 个字符。如果可以,那么在:length 子例程的for /l 循环中增加100

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

:dots <number_of_dots>
setlocal enabledelayedexpansion
set "dots=...................................................................................................."
<NUL set /P "=!dots:~-%1!"
goto :EOF

【讨论】:

  • 我觉得自己很愚蠢,没有在我的问题中写下这个,但是在 PowerShell 中也有(更简单)的方法吗?顺便说一句,我测试了脚本,太棒了!
  • 我确信有一种更简单的方法可以在 PowerShell 中编写此代码,但如果我试图发现它,则会对您造成伤害。您最好将其发布为带有 PowerShell 标记的新问题。我的PowerShell-fu不强。
【解决方案3】:

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

在批处理文件中循环也请参考这个问题: Batch script loop

【讨论】:

  • 这个对我来说很好用。但这不是真正的问题。我想知道的是如何在文件名后回显 x 个点,这样我就可以在彼此下方的同一行上获取文件的大小。 set "strvar=Count me 1234"ECHO %strvar%&gt; tempfile.txtFOR %%? IN (tempfile.txt) DO ( SET /A strlength=%%~z? - 2 )echo %strlength%
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多