2

ルートディレクトリでPDFファイルを10秒ごとにチェックし、それらのファイルをまったく同じ名前の対応するサブフォルダーにコピーするバッチファイルがあります。

私が見逃しているのは、名前付きファイルのターゲットサブディレクトリをチェックするバッチファイルが必要であり、名前付きファイルが存在する場合は、コピー先の新しいファイルの名前を変更し、重複するファイル名がコピーされる!filename!001.pdfときに001getをインクリメントする必要があることです。これが私が得たものです:

    :loop
    setlocal enabledelayedexpansion
    cls

    pushd c:\files\

    for /f "tokens=*" %%1 in ('dir /a-d /b c:\files\*.pdf') do (
    set filename=%%~n1&set dirname=!filename:~0,7!

    dir c:\files /b *.pdf > location1list.tmp
    for /f %%a in (location1list.tmp) do dir c:\files\%%a > location2list.tmp

    if not exist c:\files\!dirname! (md c:\files\!dirname!)
    move %%1 c:\files\!dirname!\>nul
    ) 
    timeout /t 10
    goto:loop

ファイルの名前を変更する方法について何か提案はありますか?

つまり、フォルダ内Bob.pdfに存在し、Bob別のフォルダBob.pdfが追加されている場合は、としてフォルダC:\filesにコピーする必要があります。C:\files\bobBob001.pdf

4

1 に答える 1

2

このような何かがあなたが望むことをするはずです。微調整が必​​要な場合があります。また、私はそれをテストしていません、ただそれをメモリから書きました。説明が必要な場合は、質問してください。

脚本

@echo off
setlocal EnableExtensions EnableDelayedExpansion
pushd C:\files

:Main
for /f "tokens=*" %%A in ('dir /a-d /b *.pdf') do (
    if not exist "%%~dpnA\*" md "%%~nA"
    set "File=%%~dpnA\%%~nxA"
    if exist "!File!" call :Name "!File!" File
    echo !File!
    move "%%~fA" "!File!"
)
goto Wait

:Name <Target> <Variable>
set "Count=0"
:Count
set /a "Count+=1"
set "Number=00%Count%"
if exist "%~dpn1%Number:~-3%%~x1" goto Count
set "%~2=%~dpn1%Number:~-3%%~x1"
goto :eof

:Wait
timeout /t 10
goto Main

:End
popd
endlocal

制限事項

  1. 各ターゲットサブディレクトリは、これが書き込まれるときに最大1000個のファイルしか処理できません。サブディレクトリがこの最大値に達すると、スクリプトは無限ループでスタックします。

アップデート

最初のスクリプトのエラーを修正しました

于 2013-03-06T15:22:20.103 に答える