2016-03-22 10 views
2

これらのファイルのすべてを、3行目の6文字の部品番号(306391)に変更する必要があります。 テキストファイルの解析と名前の変更

は現在、私は持っている:6桁の部品番号を検索し、正しい名前のファイルをリネームし

setlocal enabledelayedexpansion 

set first=1 

for /f "skip=3 delims= " %%a in (Name.txt) do ( 

    if !first! ==1 (

    set first=0 

echo %%a > out.txt 
ren Name.txt %%a.txt 

) 
) 

を。しかし、私が.txtファイルの実際の名前の代わりに* .txtを使用すると、中断されます。私はディレクトリ内のすべての.txtファイルで動作する必要があります。

+0

そこで、基本的 を%を最初の== 1( が最初に設定された場合) (/f "skip = 3 delims =" %% a in( "%%〜fI"))のdo( ) "%%〜FI" %% a.txt 私のためにファイルを作成していないようです。 – Amk2539

+2

ほぼ。さらに検査するには、スクリプトに別の調整が必要でした。私は答えに私のコメントを移動しました。ところで、最初の素晴らしい質問です!新しいメンバーが実際にコードを投稿するのを見るのは嬉しいことです。「私のためのスクリプトを書いてください。これは私が必要なものです。」あなたがそれをしなかったのはうれしいです。 ':)' – rojo

答えて

2

for /fループを別のforループで囲み、renコマンドで外側のループ変数を参照してください。ブールチェックにif definedを使用することで、遅延拡張の必要性を排除することもできます。私はこことそこに別の微調整を入れました。詳細が必要かどうか尋ねるだけです。

@echo off 
setlocal 

for %%I in (*.txt) do (

    set first= 

    for /f "usebackq skip=3" %%a in ("%%~fI") do ( 

     if not defined first (

      set first=1 

      echo %%~nxI ^> %%a.txt 
      rem // uncomment this when you're satisfied that it works correctly 
      rem // ren "%%~fI" "%%a.txt" 

     ) 
    ) 
) 
+0

あなたは "%%〜fI"と%%〜nxI ^>の使い方について詳しく説明できますが、その背後に論理がありますが、その仕組みを理解できません。 – Amk2539

+0

'%%〜fI'は、' %% I'をその完全な 'drive:\\ path \\ to \\ filename.txt'に拡張することを意味します。それは本当に必要なわけではありませんが、将来的にスクリプトを再帰的にしたい場合(最初の 'for'ループを' for/R'に変更すること)にはもっと簡単になります。 '^>'は通常は出力をファイルにリダイレクトするのではなく、コンソールにリテラル '>'文字をエコーすることを意味します。キャレットはエスケープ文字です。 – rojo

+0

%%〜nxIの使用は何ですか?気にしない、私はそれを理解した。 – Amk2539

1

各ファイルのわずか4行が読み込まれるので、この方法は、(全体ではなく、ファイルの)、ファイルが大きい特別な場合は、より高速に実行する必要があります

@echo off 
setlocal EnableDelayedExpansion 

rem Process all .txt files 
for %%f in (*.txt) do (

    rem Read the 4th line 
    (for /L %%i in (1,1,4) do set /P "line4=") < "%%f" 

    rem Rename the file 
    for /F %%a in ("!line4!") do ECHO ren "%%f" "%%a.txt" 

) 
+0

私はそれが読まれる必要がある4行目だと思う。彼は3をスキップしています。 – rojo

+0

@rojo:あなたは正しいです!修正されました(しかし、OPは "3行目"と言いました)... – Aacini

関連する問題