1

バッチファイルに問題があり、指定されたフォルダを参照するたびに10秒の遅延が組み込まれ、命名規則のサブルーチンが呼び出されます。...ディレクトリ内の変更されたファイルを別のディレクトリにコピーするバッチ

Ken Whiteに従ってコードを変更しましたが、これは非常に役立ちましたが、このバッチにさらに関連する別の問題があります。バッチが実行され、テストファイルの更新を実行して、ソースディレクトリ内に保存する場合です。バッチは、cmdコンソールで、参照するすべてのファイルに対して「ターゲット上のファイル名またはディレクトリ名を指定する」ように要求します。これをバックグラウンドで自動的に実行したいので、正しく実行するためにユーザー入力を必要としません。ヘルプや提案は非常に役立ちます。

これが私が現在持っているものです:

@Echo Off & setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
:: variables
set drive=C:\Users\me\Desktop\Test Source Folder\
set backupcmd=xcopy /m /s /c /d /e /h /i /r /y
Set _Delay=10
Set _Monitor=C:\Users\me\Desktop\Test Source Folder
Set _Base=%temp%\BaselineState.dir
Set _Chck=%temp%\ChkState.dir
Set _OS=6

:_RevLoop
set basename=
for %%a in (*.*) do (
if not defined baseName (
    rem Is first name of first set
    set baseName=%%~Na
    set baseExt=%%~Xa
    set lastname=%%~Na
    ) else (
    rem Check if this name begin with same baseName
    set name=%%~Na
    for %%b in (!baseName!) do set name=!name:*%%b=!
      if "!name!" neq "%%~Na" (
         rem Yes: Is next name of same set
         set lastName=%%~Na
      ) else (
         rem No: Is first name of next set: copy previous set and pass to next one
         %backupcmd% "!lastName!!baseExt!" "C:\Users\me\Desktop\Test Destination Folder\!baseName!!baseExt!"
         set baseName=%%~Na
         set baseExt=%%~Xa
         set lastName=%%~Na
      )
   )      
)
rem Copy last set
%backupcmd% "!lastName!!baseExt!" "C:\Users\me\Desktop\Test Destination Folder\!    baseName!!baseExt!"


Ver|Findstr /I /C:"Version 5">Nul
If %Errorlevel%==0 Set _OS=5 & Set /A _Delay=_Delay*1000
:_StartMon
Call :_SetBaseline "%_Base%" "%_Monitor%"
:_MonLoop
If %_OS%==5 (Ping 1.0.0.0 -n 1 -w %_Delay%>Nul) Else Timeout %_Delay%>Nul
Call :_SetBaseline "%_Chck%" "%_Monitor%"
FC /A /L "%_Base%" "%_Chck%">Nul
If %ErrorLevel%==0 Goto _MonLoop



echo ___ Backing up JobBoss files...
::%backupcmd% "C:\Users\me\Desktop\Test Source     Folder" "C:\Users\me\Desktop\Test Destination Folder\"

::CALL "C:\users\me\Desktop\Test Source Folder\Test.bat"

ECHO ___ Checking for new file revisions...


GOTO :_RevLoop


Echo.Backup Complete!

Goto :_StartMon
:::::::::::::::::::::::::::::::::::::::::::::::::::
:: Subroutine
:::::::::::::::::::::::::::::::::::::::::::::::::::
:_SetBaseline
If Exist "%temp%\tempfmstate.dir" Del "%temp%\tempfmstate.dir"
For /F "Tokens=* Delims=" %%I In ('Dir /S "%~2"') Do (
Set _Last=%%I
 >>"%temp%\tempfmstate.dir" Echo.%%I
)
>"%~1" Findstr /V /C:"%_Last%" "%temp%\tempfmstate.dir"
Goto :EOF
4

1 に答える 1

1

ファイルをコピーするときにファイルの名前を変更する必要がないと仮定して、試してみてください

%backupcmd% "!lastName!!baseExt!" "C:\Users\me\Desktop\Test Destination Folder\"

注:末尾がスイッチ\の必要性を否定していることがわかりました。/i

編集:新しい戦略。上記のコマンドを使用して最初にベースファイルをコピーし、次に最終ファイルをコピーすると、プロンプトが表示されずに上書きされます。

for %%a in (*.*) do (
    if not defined baseName (
        rem Is first name of first set
        set baseName=%%~Na
        set baseExt=%%~Xa
        set lastname=%%~Na
        %backupcmd% "%%a" "C:\Users\me\Desktop\Test Destination Folder\"
    ) else (
        rem Check if this name begin with same baseName
        set name=%%~Na
        for %%b in (!baseName!) do set name=!name:*%%b=!
        if "!name!" neq "%%~Na" (
            rem Yes: Is next name of same set
            set lastName=%%~Na
        ) else (
            rem No: Is first name of next set: copy previous set and pass to next one
            %backupcmd% "!lastName!!baseExt!" "C:\Users\me\Desktop\Test Destination Folder\!baseName!!baseExt!"
            set baseName=%%~Na
            set baseExt=%%~Xa
            set lastName=%%~Na
            %backupcmd% "%%a" "C:\Users\me\Desktop\Test Destination Folder\"
        )
    )
)
于 2012-11-29T21:55:14.937 に答える