2016-11-09 8 views
0

大量のファイルの名前を変更するバッチスクリプトを作成しました。名前を取り、それをテキスト文書で検索し、その行をコピーし、必要なデータを取り込み、ファイルの名前を変更します。Windowsバッチの名前をテキスト文書から変更する

ほとんどの部分は正常に動作するようですが、私はそれが常にコンソールでエラー/警告が生成されるので、それはやっているかどうかを確認することはできません。

@echo off 
set ogg=.ogg 
Setlocal EnableDelayedExpansion 
for %%a in (*.ogg) do (
    set fileNameFull=%%a 
    set fileName=!fileNameFull:~0,-4! 
    for /F "delims=" %%a in ('findstr /I !fileName! strings.txt') do (
     endlocal 
     set "stringLine=%%a%ogg%" 
    ) 
    Setlocal EnableDelayedExpansion 
    set fullString=!stringLine:~26! 
    ren %%a "!fullString!" 
) 

pause 

コードが動作する、ファイルの10,000秒の時に名前を変更されているように私はちょうど、進捗状況を追跡できるようにしたいのですが、私はどのくらい離れているかのプロセスに沿っての兆候をしましたん。

エラーは以下のとおりです。

"FINDSTR: Cannot open [...]" 
"The syntax of the command is incorrect." 

答えて

0
@echo off 
Setlocal EnableDelayedExpansion 
for %%a in (*.ogg) do (
    for /F "delims=" %%q in ('findstr /I /L /c:"%%~na" strings.txt') do (
    set "stringLine=%%q" 
    ) 
    ECHO ren "%%a" "!stringLine:~26!.ogg" 
) 

pause 

このコードは、あなたが投稿したコードと、同等の、しかし固定する必要があります。

修正:

Removed the endlocal/setlocal complication - not required 
changed the inner `for` metavariable - must not be duplicate `%%a` 
Changed the `findstr` switches - add `/L` for literal and `/c:` to force single token in case of a separator-in-name; use `%%~na` to specify "the name part of `%%a`" to avoid the substringing gymnastics. 
removed said gymnastics 
Removed 2-stage string manipulation of destination filename 
Removed superfluous setting of `ogg` 

結果のコードは、それが単にrename命令を報告しますことを除いて、あなたがもともと持っているもの複製する必要があります。検証するために、これを小さな代表サンプルに対してテストする必要があります。カウント/進捗状況について

あなたが進む前に、ユーザーのアクションを待つ

if %stringline% equ 0 echo !count! Processed&pause 

を使用することができ、各1000

を進める表示されるはずです

set /a count=0 
for %%a in (*.ogg) do (
    for /F "delims=" %%q in ('findstr /I /L /c:"%%~na" strings.txt') do (
    set "stringLine=%%q" 
    ) 
    ECHO ren "%%a" "!stringLine:~26!.ogg" 
    set /a count +=1 
    set /a stringline= count %% 1000 
    if %stringline% equ 0 echo !count! Processed 
) 

pause 

...

ところで、NEWNAMEは、ファイル内の列27+からであるという仮定を作るのを-I'mあなたは私たちにサンプルを示していません。また、単純なfindstrは、新しい文字列または古い名前のいずれかとして、ファイル内の任意の部分文字列としてターゲット文字列を検索することに注意してください。 findstr/Bスイッチを起動すると、文字列は行の先頭にのみ一致します。

+0

返信いただき、ありがとうございます。 DelayedExpansionを無効にしなければならなかったのは、 "!"テキストファイルからコピーされた文字列内の文字列が削除されていました。私はこれが問題を引き起こしていると思うが、私はその代替案が何であるか分からない。 – Adamj200

+0

これは、サンプル代表データを提供する理由です。この場合、全体のアプローチを変更することができます。 – Magoo

関連する問題