2016-05-20 15 views
1

これは私の最初の投稿です。誰かが私を助けてくれることを願っています。ファイルパスの長さをバッチファイルでチェックします。 #stringlength

私はかなり新しい.batファイルですが、私はphpとC++の基本的な知識があります。

次のようなバッチファイルを作成する必要があります。 1.フルファイルパスを含むすべてのファイルを現在のフォルダに表示します。 2.個々のファイルごとのファイルパスを含む、表示されたファイルの長さを表示します。 3.合計ファイル数を表示することがあります。

私は今までこれを書いていますが、ジョブ#1と#3はしていますが、文字列の長さを表示できません。

@echo off 
for /r . %%g in (*.*) do (
    echo %%g 
)  
set cnt=0 
for %%A in (*) do set /a cnt+=1 
set /A cnt=cnt-1 
echo Dateien im Verzeichnis = %cnt% 
PAUSE 

文字列またはパスの長さをそれぞれ識別する2つのスクリプトがありますが、最初のスクリプトと一緒に配置できませんでした。ここで

文字列な長さのために1:

@echo off 
set myvar="some string" 
rem compute the length of a string 
set #=%myvar% 
set length=0 
:loop 
if defined # (
    rem shorten string by one character 
    set #=%#:~1% 
    rem increment the string count variable %length% 
    set /A length += 1 
    rem repeat until string is null 
    goto loop 
) 
echo myvar is %length% characters long! 
PAUSE 

そして、ここでは現在のフォルダのパスの長さを表示します作品:

@echo off 
echo %cd%>"%TMP%\Temp.txt" 
for %%l in ("%TMP%\Temp.txt") do set /a len=%%~zl 
del "%TMP%\Temp.txt" 
set /a len-=2 
echo Path length = %len% chars. 
PAUSE 
+0

[ここで '便利で、より効率的です:length'ユーティリティ関数](http://stackoverflow.com/a/35203119/1683264)あなたのスクリプトにプラグインすることができます。 [このページを見る](http://www.dostips.com/DtTutoFunctions.php)バッチスクリプト機能の詳細については、こちらをご覧ください。 – rojo

+0

私はそれが動作するようには思えません。私は確かに長い私のファイルパスごとに4 ... 8 ... 28のような乱数を与えました。あなたが想像したように私にそれをまとめてくれるように頼むのは大変ですか?グローバル変数とローカル変数に問題があると思います。何かが間違っています。事前に感謝しています、ルーク –

+0

おそらく遅延拡張問題です。私は答えを投稿します。 – rojo

答えて

1

ここthis :length util functionに基づくソリューションです。バッチスクリプト機能の詳細については、see this pageを参照してください。またread more about delayed expansionにする必要があります。遅延拡張を使用しない場合でも、すべてのスクリプトの先頭にsetlocal ought to be includedがあります。

@echo off 
setlocal 

set "files=0" 

for %%I in (*) do (
    set /a files += 1 
    call :length len "%%~fI" 

    rem // delay expansion of %files% and %len% because of reasons 
    setlocal enabledelayedexpansion 
    echo !files!: %%~fI is !len! characters long. 
    endlocal 
) 

goto :EOF 

:length <return_var> <string> 
setlocal enabledelayedexpansion 
if "%~2"=="" (set ret=0) else set ret=1 
set "tmpstr=%~2" 
for %%I in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
    if not "!tmpstr:~%%I,1!"=="" (
     set /a ret += %%I 
     set "tmpstr=!tmpstr:~%%I!" 
    ) 
) 
endlocal & set "%~1=%ret%" 
goto :EOF 
+0

貴公子、あなたの助けをありがとう。これは動作します!私の上司は、私たちにITにスケッチフリーウェアをダウンロードしてもらう必要はありませんでした。素晴らしい一週間を過ごして、すべてに感謝します! –

+0

@ LukeFast私の答えが役に立ったら、それを受け入れたものとしてマークしてください。なぜこれが重要であるかの説明については、[このQ/A投稿を見る](http://meta.stackexchange.com/q/5234/275822)を参照してください。 – rojo

関連する問題