0

ファイル名の長さに基づいて x ドット数をエコーする方法を見つけようとしています。

私が作っているBatch-scriptで、ファイル名とファイルのサイズが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ループで使用して、文字列の長さを決定できます。filenameのx文字数が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 文字を超えるファイル名がないことを前提としています。可能であれば、サブルーチン100for /lループ内を増やしてください。:length

速度を最適化したサブルーチンが必要な場合:dotsは、スクリプトの最後の 4 行を次のように置き換えます。

: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 に答える