2011-01-20 7 views
1

だから私はいくつかのファイルでdirを持っています。私は、ファイル名の各部分の最初の文字だけを取って、私はこの部分にこだわっている 特定のファイル・renamingscriptをしたい:バッチファイルの名前を "This.is.a.FIlename.mp3"から "tiaf.mp3"

ファイル名は次のようになり場合

This.is.a.FIle.mp3 

私はしたいと思います名前を

tiaf.mp3 

に変更してください。すべて小文字にします。

単語の長さは可変なので、ローカル変数として参照することはできません!変数:〜0,2!

誰でも手助けできますか? ありがとうございました!

編集:私はおねがいします。ファイル名が私が述べた形式のものであるかどうか、テストをする考えがあれば。ファイルが呼び出された場合。 「file.mp3」が、私はそれはf.mp3」に名前を変更することはしたくないでしょう

+0

使用しているOSとシェルは何ですか? –

+0

windows msdos shell、Jason – Rps

+1

私はおそらくファイル名%%〜nを抽出して変数に入れて、coulsは各単語を検索しなければならないと思っていました。これらを変数に入れれば、私はそれらを変数と呼ぶことができます:変数:〜0,1!これは可能ですか? – Rps

答えて

4

これはうまくいくはずですが、 "!"あなたのファイル名に感嘆符を付けるには、少し拡張する必要があります。

@echo off 
setlocal EnableDelayedExpansion 
for %%f in ("C:\temp\folder\*.*") do (
    call :createName "%%~f" 
) 
goto :eof 


:: Compress a filename with more than one dot to only the first (lower) letters of each part 
:: one.TWO.three.four.exe to ottf.exe 
:createName <dot-filename> 
setlocal 
set "filename=#.%~n1" 
set "ext=%~x1" 
set "count=0" 
set "short=" 

:createName.loop 
for %%a in ("!filename!") do (
    set "part=%%~xa" 
    set "filename=%%~na" 

    if defined part (
     set /a count+=1 
     set "char=!part:~1,1!" 
     call :toLower char 
     set "short=!char!!short!" 
    ) ELSE (
     set "char=" 
    ) 
    rem echo "%%~na"-"%%~xa" "!char!" "!short!" 
) 
if defined part goto :createName.loop 
set "short=!short!!ext!" 
if !count! GTR 1 (
    echo ren "%~f1" "!short!" 
) 
(
    endlocal 
    goto :eof 
) 


:: convert a char to the lower variant or leave it unchanged if it isn't a char 
:: use the %var:*n=% syntax to remove the front of a string, to get the correct char 
:toLower <variable to char> 
setlocal EnableDelayedExpansion 
(
set "char=!%~1!" 
set "helper=##aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz" 
set "lower=!helper:*%char%=!" 
set "lower=!lower:~0,1!" 
if "!lower!"=="#" set "lower=!char!" 
) 
(
    endlocal 
    set "%~1=%lower%" 
    goto :eof 
) 
+0

非常に柔軟ではありません! あなたはTEL私をどこコードでは、私はテストのために呼び出すことができますか?ファイル名の部品数のために。それは一部のみで構成されている場合は、私は呼びたいウォルド別の機能 – Rps

+0

これはif!count!GTR 1 ...部分 – jeb

+0

やめろ!あなたは私の一日を作った! – Rps

3

でしょうあなたのためのロジック、この種の仕事:

@echo off 

for /f "delims=|" %%f in ('dir /b C:\temp') do call :runsub %%f 
goto EOF 

:runsub 
for /f "tokens=1,2,3,4 delims=." %%a in ("%~n1") do set a=%%a&set b=%%b&set c=%%c&set d=%%d 

if not "%a%"=="" echo %a% 
if not "%b%"=="" echo %b% 
if not "%c%"=="" echo %c% 
if not "%d%"=="" echo %d% 

:EOF 

あなたはエコー%%を変更することができ、 echo%b%などを設定し、これらから部分文字列を取得します。これはまた、最初の4つの分割のみを取得します。必要に応じて追加できます。また、C:\ tempを適切なディレクトリに変更します。

+0

thanx、しかし私は2回エコーを取得します。それで、それはすべての単語を印刷しますが、それを再び行います。どこがうまくいかないのか? "%a%" == ""テストとはどういう意味ですか? – Rps

+0

私は 'e = %% e&set'を追加しようとしましたが、ファイル名が5より小さくなるとエラーになります。 – Rps

+0

テスト%a% "==" "コマンドで使用する前に変数が空白かどうかをチェックします。 。Eの – msrxthr

関連する問題