1

私はWindows7で、名前とファイルディレクトリを指定し、そのディレクトリ内のすべてのファイルの名前を、ユーザーが0から9までの数字に連結した名前に変更する.batファイルを探していました。たとえば、 :2つのファイルa.txtとb.txtがあるディレクトリがあり、それらの名前をdocumentX.txt(Xは0から9までの数字)に変更したいので、最後にスクリプトが名前を変更するとします。 document1.txtおよびdocument2.txtに

私はこのようなことを試しましたが、成功しませんでした:

    @echo off
    @set a=1
    @set pref=hola

    for /D %%f in (C:\*.txt) 
     do 
     rename *.txt %pref%%a%
     @set /A a = %a%+1
4

1 に答える 1

1

FOR コマンドは、括弧または行継続を使用しない限り、複数の行にまたがることはできません^。最初の開き括弧は IN と同じ行に、2 番目の開き括弧は DO と同じ行になければなりません。

値を設定するかっこで囲まれたコード ブロック内で通常の展開を使用することはできません。これは、展開が解析時に発生し、ブロック全体が一度に解析されるためです。したがって、値は、設定する前に存在していた値になります! 解決策は、遅延展開を使用することです。これは、行が実行されたときに発生します。で有効にする必要がありますsetlocal enableDelayedExpansion

!はファイル名内で有効であり、遅延展開が有効になっている場合に FOR 変数の展開が破損するため、遅延展開は問題を引き起こします!。解決策は、ループ内で遅延展開のオンとオフを切り替えることです。

オプションなしの単純な FOR が必要です。この/Dオプションは、ファイルではなくディレクトリを探します。

SET /Aステートメント内で数値変数を展開する必要はありません。

最後にもう 1 つ -@使用後は必要ありませんECHO OFF

@echo off
setlocal disableDelayedExpansion
set "n=0"
set "pref=document"

for %%F in (c:\*.txt) do (
  set "file=%%F"
  set /a n+=1
  setlocal enableDelayedExpansion
  ren "!file!" "%pref%!n!.txt"
  endlocal
)

このタスクを実行するためのより簡単な方法があります。DIR /Bすべての.txtファイルを一覧表示し、結果を にパイプするために使用しますFINSTDR /N "^"。FINDSTR はすべてのファイルに一致し、各値の前に連番とそれに続くコロンを付けます。FOR /F を使用して結果を数値とファイル名に解析し、RENAME できるようにします。

@echo off
setlocal
set "pref=document"
for /f "tokens=1* delims=:" %%A in ('dir /b /a-d *.txt^|findstr /n "^"') do (
  ren "%%B" "%pref%%%A.txt"
)
于 2012-10-27T23:40:45.307 に答える