5

Windows バッチ ファイルを使用して、ある特定のディレクトリから別のディレクトリにファイル (myfile0001.bdg) をコピーしたいと考えています。しかし、ターゲットディレクトリにファイルが存在するかどうかを確認し、答えが「はい」の場合は、ファイルに 0001 をインクリメントし、ファイルが存在しないかどうか (myfile0002.bdg) を再度確認し、ファイルが存在しなくなるまでコピーします。新しいタイトルのファイル。

したがって、ターゲットディレクトリにある場合、次のファイルがあります。

myfile0001.bdg
myfile0002.bdg
myfile0003.bdg
myfile0004.bdg
myfile0005.bdg
myfile0006.bdg

新しいファイルの名前は myfile0007.bdg にする必要があります。次回バッチを実行すると、新しいファイルは myfile0008.bdg などになります。

コマンド「IF EXIST」があることは知っていますが、必要なことを行う方法がわかりません。

==============

  • Windows 7 x32 を使用しています
  • ソース ディレクトリは「C:\USERS\RAMBYTES\DOCUMENTS\」です。
  • 対象ディレクトリは「P:\BACKUP\」
  • ファイルは「MYFILE0001.BDG」
4

3 に答える 3

1
@ECHO OFF
SET destdir=c:\destdir
SET newname=myfile0000
FOR /f %%i IN (' dir /b /on %destdir%\myfile????.bdg ' ) DO SET newname=%%~ni
SET newname=1%newname:~-4%
SET /a newname+=1
SET newname=myfile%newname:~-4%.bdg
COPY myfile0001.bdg %destdir%\%newname%

必要に応じて宛先ディレクトリを変更し、必要に応じてソース ディレクトリを含めます。

于 2013-03-03T15:53:45.453 に答える
1

このようなもの:

@echo off

set source_file=C:\USERS\RAMBYTES\DOCUMENTS\MYFILE0001.BDG
set target_dir=P:\BACKUP\
set done=0

for /l %%i in (1,1,1000) do (
   call :check_and_copy %%i
   if errorlevel 1 goto :eof
)

goto :eof

:check_and_copy
  setlocal EnableDelayedExpansion
  set num=000000%1
  set fnum=!num:~-4!

  set fname=%target_dir%\myfile%fnum%.bdg
  rem echo %fname%
  if not exist "%fname%" (
     echo copying %source_file% to %fname%
     exit /b 1
  )
  exit /b 0

ターゲット ディレクトリに 1000 を超えるファイルが存在する場合のエラー処理はありません。ファイルの制限を増やしたい場合は、ループの「メイン」とサブプログラムの数値の「フォーマット」を調整する必要があります

先行ゼロを追加するトリックは、ここから取得されました: https://stackoverflow.com/a/9430912/330315

于 2013-03-03T15:40:29.043 に答える
0
  1. ファイル名を取ります。

  2. 数値部分を抽出します。

  3. 対応するターゲット名が存在するかどうかを確認してください。

  4. もしそうなら、

    4.1)数値部分を増やします。

    4.2)可能な最大数を超えない場合は、ステップ3に進みます。

    4.3)それ以外の場合は終了します。

  5. ターゲット名が存在しない場合は、現在の数値部分を含むファイルをコピーして終了します。

アルゴリズム的には、4.2の条件は、上記のように数値部分を増やした直後にチェックする方が自然かもしれませんが、以下のスクリプトは、ループの開始直後の別のポイントでチェックを実行します。ソースファイル名の元の数値。実装上、それは私にはもっと便利に思えました。

他のすべての点で、スクリプトは同じアルゴリズムを実装します。

@ECHO OFF
SET "fname=%~n1"
SET counter=1%fname:~-4%
:loop
IF %counter% GTR 19999 (
  1>&2 ECHO Cannot copy the file: no free slots.
  EXIT /B 1
)
SET "targetname=%~2\%fname:~0,-4%%counter:~1%%~x1"
IF EXIST "%targetname%" (
  SET /A counter+=1
  GOTO loop
) ELSE (
  COPY %1 "%targetname%"
)

いくつかの部分を説明するには:

  1. ~位置パラメータを参照するチルダ( )は、対応するパラメータの引用符を外すことを意味します。

    スクリプトでは、チルダの直後に修飾子が続く場合もあります。nここでは、2つの修飾子が使用されていますx。前者はパラメータを対応するファイル名のみ(パスと拡張子なし)に展開し、後者は拡張子のみを抽出します。

    FORコマンドの組み込みで修飾子について詳しく知ることができます(実行することにより)

  2. 名前部分の抽出は環境変数でのみ実行できるため、fname環境変数が必要です。特に、式は値の%fname:~-4最後の4文字に評価されfnameます。具体的には、次のようになります。末尾から4番目の文字で始まる部分文字列を抽出し、-4別の引数が続かないように、その時点から文字列の末尾までのすべての文字を含めます。

    別の似たような式、は逆のことをします。最後の4文字を除い%fname:~0,-4%ての内容を返します。数字の意味は次のとおりです。文字列の先頭(オフセット0)から始まり、末尾から4のオフセットにある文字までの範囲にまたがる部分文字列を抽出します。fname

    この種のもう1つの式、は%counter:~1、2番目の式(つまり、オフセット1)から文字列の終わり(2番目の引数なし)までの文字を抽出します。

    SET /?文字列式の詳細については、実行してください。

  3. counter実装にも説明が必要な場合があります。ファイル名の数値部分の1前に追加する必要があるのは、値をインクリメントするときに値全体を正しく解釈して処理できるようにするためです。

    つまり、0で始まる数値は、CMDコマンドプロセッサでは8進数として扱われるため、1先頭に置くと、実際の数値を10進数として解釈することになります。ターゲットファイルの完全な名前を作成するときは、追加されたを破棄する必要があります。1これは、%counter:~1が使用される目的です。

于 2013-03-03T16:54:29.320 に答える