2

次のようにカスタム ファイル名を出力する Windows バッチ ファイル "printFileNames.bat" を作成したいと思います:
Adobe_1, DIFX_2, WinRAR_3...

ループ内で変数を操作する方法がわかりません。これは私が持っているものです:

for /r C:\myDir\ %%i in (*) do (
   set counter=counter+1
   set myFileName=%%i+counter
   echo myFileName >> C:\list.txt
)
4

4 に答える 4

4

明示的なカウンターを使用せずに、必要な出力を取得することは可能です。

@ECHO OFF
FOR /F "delims=: tokens=1*" %%R IN ('DIR /A-D-H /B /S D:\to_delete\* ^| FINDSTR /N .') DO (
  ECHO %%~dpnS_%%R%%~xS
)

このDIRコマンドはファイルのリストを提供し、FINDSTRそれに番号を付けます。FOR /Fループは出力を処理FINDSTRしてファイル名から番号を分離し、ファイル名ECHOに番号が追加された最終出力を生成します。

数字が名前に追加されることに注意してください。つまり、拡張子の前に追加されるため、ファイル名は次のようになります。

D:\path\name.ext

次のように変更します。

D:\path\name_1.ext

実際にこのようにしたい場合:

D:\path\name.ext_1

ECHO上記のコマンドを次のコマンドに置き換えます。

ECHO %%S_%%R
于 2012-06-12T20:32:06.557 に答える
3

知っておくべき 3 つのこと:

  1. 変数演算を実行する場合は、set /aコマンドを使用します (ただし、ドキュメントは少し古くなっています)。
  2. ifループ内でステートメントを使用する場合はfor、ループが中断されます。call内部サブルーチンとそこからユーザーを呼び出すために使用できますif。サブルーチンのパラメーターは、変数%1%2などを介して渡されます (通常のバッチ ファイルと同様)。
  3. フルパスが に格納されていると仮定しましょう%%f。拡張子なしで名前だけを抽出する場合は、%%~nfフォームを使用します。

そうは言っても、次のコードを試してください。

    @echo off
    set counter=0
    for /r "C:\myDir\" %%f in (*) do (
        set /a counter+=1
        call :HandleFile "%%f"
    )
    goto :eof

:HandleFile
    if "%~x1"==".jpg" goto :eof
    if "%~x1"==".gif" goto :eof

    set "myFileName=%~n1_%counter%"
    for %%^" in ("") do >>C:\list.txt echo %%~"%myFileName%

EDIT : 特別なファイル名を処理し、特定の拡張子を持つファイルをスキップするようにスクリプトを修正しました。

それが役に立てば幸い!

于 2012-06-12T15:58:34.823 に答える
1

ループ内のカウンターの値にアクセスするには、遅延拡張が必要です。カウンターをインクリメントするには、スイッチ
が必要です。SET /A

setlocal EnableDelayedExpansion
set counter=0
for /r C:\myDir\ %%i in (*) do (
  set /a counter=counter+1
  set "myFileName=%%i_!counter!"
  echo !myFileName!>> C:\list.txt
)

ファイル名に感嘆符が含まれている場合、これは失敗します。!このようなより安定したバージョンが必要です

setlocal DisableDelayedExpansion
set counter=0
for /r C:\myDir\ %%i in (*) do (
  set /a counter=counter+1
  set "filename=%%i"

  setlocal EnableDelayedExpansion
  set "myFileName=!filename!_!counter!"
  echo !myFileName!>> C:\list.txt
  endlocal
)
于 2012-06-12T13:04:10.710 に答える
1
@echo off
setLocal EnableDelayedExpansion

set N=0
for /f "tokens=1 delims=." %%i in ('dir /b C:\mydir\') do (
    set /a N+=1 
    echo %%i_!N!
)
于 2012-06-12T13:16:41.313 に答える