ファイルをランダムに選択、名前を変更、新しいディレクトリに移動


1

異なるファイル名を持つ40以上のファイルがロードされるディレクトリがあります。これらはすべて同じファイル名構造で始まりますが、最後に日付が追加されます。

例:

FILE.txt.01012013
FILE.txt.01022013
FILE.txt.01032013

いくつかの複雑なこととそれほど複雑ではないことを行うバッチファイルを作成する必要があります。

  1. ファイルを1つだけ選択してください。
  2. そのファイルの名前を別の名前に変更します。(例:TEST.txt)注:名前を変更したファイルの名前は常にTEST.txtになります)
  3. 名前を変更したファイルを現在のディレクトリから新しいディレクトリに移動します。
  4. 15分後...もう一度ステップ1から始めます。(注:これは、元のディレクトリにファイルがなくなるまで実行し続ける必要があります。)

試したこと:バッチファイルに関する私のスキルレベルは非常に基本的であるため、Webで検索して提案を探しています。ファイルの名前を変更するコードを見つけることができます(ただし、元のファイル名を指定する必要があります)。ファイル名に*を使用してファイルを見つけるコードを見つけることができますが、ディレクトリ内のすべてのファイルを選択すると思います。一度に1つのファイルに対して、15分ごとに発生する必要があります。ファイルの名前が変更され、新しいディレクトリに移動されると、そのファイル(この例ではTEST.txt)を取得してデータを取り込むFile Watcherプロセスがあります。データが取り込まれると、ファイルは削除されます。これは、次のファイルの名前がTEST.txtに変更されてディレクトリに移動されたときに、前のファイルを上書きする理由がないことを意味します。


1
スーパーユーザーへようこそ。すでに試したことを教えてください。投稿を編集して質問にすることで、詳細な回答が得られる可能性が高まります。また、既に開始しているコードを投稿し、これを使用するOSなどの詳細を追加すると非常に役立ちます。
チャーリーRB

詳細を追加しましたが、残念ながらそれが大いに役立つとは思いません。
JPフック

回答:


0

これはあなたが望むもののように見えますが、ギャップを埋める必要があります。

set count=0
for /f %%i in (file_path\*.*) do set /a count+=1
set test=%count%
:loop
if %test% neq %count% timeout /nobreak 900 >nul
set /a num=%random% %% %count% + 1
set /a count-=1
if %count% leq 0 goto end
for /f "skip=%num%" %%i in (file_path\*.*) do (
    ren %%i TEST.txt
    move TEST.txt file_path\
    goto loop
)
:end

それが何をする:

  1. フォルダー内のファイル数(変更する必要があるもの)を確認します。
  2. フォルダー内のファイルの量を最大とする乱数を作成します。
  3. 次回のために、最大数から1つを取ります。
  4. ランダムな量のファイル(乱数で指定)をスキップし、次のファイルを選択します。
  5. ファイルの名前をTEXT.txtに変更し、file_path \(変更する必要がある)に移動します。
  6. 15分(900秒)待ちます。

お役に立てば幸いです。

注:** file_path **を適切なファイルに変更する必要があります。


/ fはディレクトリを読み取らないため、これは機能しません。dir 修飾子なしのコマンドまたは単純なforループを使用します。
エンドロ

で何をし"skip"ますfor /f "skip=%num%" %%i in (...か?
ケビンフェガン

@KevinFegan一定量のファイルをスキップして、次のファイルを選択することを意図していました。これは基本的にランダムファイルを選択することでした。
BDM

@Endoro OPは、ランダムなファイルを選択すると述べました。それにもかかわらず、あなたは正しいです。
BDM

OP Randomlyが、フルネームが事前に知られていないファイル(のようなものRandomly named)を見つけることについて話していると言ったとき、私は思う。ファイルが処理される順序について話しているとは思わない。OPがこれを明確にすることを願っています。
ケビンフェガン

0

これを試してください、それはあなたが求めたすべてのことを行います:

@echo off&setlocal enabledelayedexpansion
set "startfolder=folder1"
set "targetfolder=folder2"

cd /d "%startfolder%"
:randomstart
set /a filecnt=0
for %%i in (*) do set /a filecnt+=1
if %filecnt% equ 0 echo(no file found in %Startfolder%&goto:eof
set /a rd=(%random%%%%filecnt%)+1
set /a cnt=0
for %%i in (*) do set /a cnt+=1&if "!cnt!" equ "%rd%" set "randomfile=%%~i"
echo "%randomfile%"
move "%randomfile%" "%targetfolder%\test.txt"
ping -n 900 localhost >nul
goto:randomstart

-1

ファイルを処理する簡単なバッチスクリプトを次に示します。

@echo off

rem     set your file-match pattern here. Could be *.* for all files, or whatever you wish.
set "zzmatchpattern=FILE.txt.*"

rem     set filename for renamed files
set "zzfinalname=TEST.txt"

rem     set source folder here
set "zzsourcepath=C:\source\"

rem     set destination folder here
set "zzdestpath=C:\dest\"

rem     set your loop delay here
set "zzdelayminutes=15"

rem     **********************************
rem     might be good to add some error checking here
rem     **********************************


:start
rem:start
set /a zzdelayseconds=zzdelayminutes*60


:restart
rem:restart

for %%f in ("%zzsourcepath%%zzmatchpattern%") do call :work "%%~f"

timeout /t %zzdelayseconds%
goto :restart


:work
rem:work

set "zz_w1=%~1"
echo.
echo Renaming file "%zz_w1%" to "%zzfinalname%"
ren "%zz_w1%" "%zzfinalname%">nul 2>&1

echo Moving file: "%zzsourcepath%%zzfinalname%" to "%zzdestpath%"
move "%zzsourcepath%%zzfinalname%" "%zzdestpath%">nul 2>&1

timeout /t %zzdelayseconds%

rem     Go get next file, if any.
goto :EOF



より完全なソリューションが必要な場合は、以下のバッチスクリプトに含まれています。

  • 入力値の妥当性検証(エラーチェック)をかなり完了します。
  • 簡単な変更で、コマンドラインから安全に値を入力できます。
  • 開始時に、既存のターゲットファイルが存在するかどうかを確認し、外部プロセスがファイルを削除するのを待ちます。
  • 失敗した名前変更および移動操作を確認して報告します。
  • 終了/失敗後に名前が変更されたが移動されていないファイルを処理した後に再開します。
  • (オプション)プロンプト表示された遅延(Choice.exe)を許可して、「今すぐ続行」と「優雅な」終了を許可します。


@echo off

rem     set your file-match pattern here. Could be *.* for all files, or whatever you wish.
set "zzmatchpattern=FILE.txt.*"

rem     set filename for renamed files
set "zzfinalname=TEST.txt"

rem     set source folder here
set "zzsourcepath=C:\source"

rem     set destination folder here
set "zzdestpath=C:\dest"

rem     set your loop delay here
set "zzdelayminutes=15"

rem     select  Prompted-delay, or simple Timeout-delay. P=Prompted, otherwise simple Timeout
rem     For Prompted-delay "Choice.exe" must be present on the computer.
set "zzdelaytype=T"


rem     **********************************
rem     error checking
rem     **********************************


:checksourcepath
rem:checksourcepath

rem     insure source path is valid (exists), and has trailing slash
if "%zzsourcepath%."=="." goto :sourcepatherror
set zzt1=%zzsourcepath:~-1,1%
if not "%zzt1%."=="\." set "zzsourcepath=%zzsourcepath%\"
if not exist "%zzsourcepath%*.*" goto :sourcepatherror
goto :checkdestpath


:sourcepatherror
rem:sourcepatherror

echo.
echo Error processing source path: [%zzsourcepath%].
echo.
call :cleanexit
exit /b 1


:checkdestpath
rem:checkdestpath

rem     insure dest path is valid (exists), and has trailing slash
if "%zzdestpath%."=="." goto :destpatherror
set zzt1=%zzdestpath:~-1,1%
if not "%zzt1%."=="\." set "zzdestpath=%zzdestpath%\"
if not exist "%zzdestpath%*.*" goto :createdestpath
goto :checkname


:createdestpath
rem:createdestpath

md "%zzdestpath%" >nul 2>&1
if not exist "%zzdestpath%*.*" goto :destpatherror
goto :checkname


:destpatherror
rem:destpatherror

echo.
echo Error processing destination path: [%zzdestpath%].
echo.
call :cleanexit
exit /b 2


:checkname
rem:checkname

if "%zzfinalname%."=="." goto :nameerror
goto :checkdelayminutes


:nameerror
rem:nameerror

echo.
echo Error: Rename target filename cannot be empty.
echo.
call :cleanexit
exit /b 3


:checkdelayminutes
rem:checkdelayminutes

set zzt1=0
set zzt2=1
set /a zzt1=zzt2*zzdelayminutes
if "%zzt1%."=="." goto :minute1serror
if %zzt1% LEQ 0 goto :minutes1error
if %zzt1% GEQ 1441 goto :minutes2error
goto :checkpattern


:minutes1error
rem:minutes1error

echo.
echo Error: Minutes must be a number greater than 0.
echo.
call :cleanexit
exit /b 4


:minutes2error
rem:minutes2error

echo.
echo Error: Minutes must be a number not greater than 1440 (1 day).
echo.
call :cleanexit
exit /b 5


:checkpattern
rem:checkpattern

rem     pattern must have at least 1 "*"
if "%zzmatchpattern%."=="." goto :patternerror
echo "%zzmatchpattern%"|find "*">nul
if %errorlevel% EQU 0 goto :start
rem goto :patternerror


:patternerror
rem:patternerror

echo.
echo Error: Pattern cannot be empty, and must contain at least 1 "*".
echo.
call :cleanexit
exit /b 6


:start
rem:start
set /a zzdelayseconds=zzdelayminutes*60
set /a zzpartialdelay=zzdelayseconds/3
set zzexiting=0


:restart
rem:restart

rem     if destination file already exists, wait a bit more

if not exist "%zzdestpath%%zzfinalname%" goto:checkaborted

call :waitexternal
if %zzexiting% NEQ 0 exit /b %zzexiting%
goto :restart


:checkaborted
rem:checkaborted

if not exist "%zzsourcepath%%zzfinalname%" goto :work1
echo.
echo Completing previously started file move.
echo Moving file: "%zzsourcepath%%zzfinalname%" to "%zzdestpath%"
move "%zzsourcepath%%zzfinalname%" "%zzdestpath%">nul 2>&1
goto :restart


:work1
rem:work1

set zzdelayflag=1
set zzsuccess=0
for %%f in ("%zzsourcepath%%zzmatchpattern%") do call :work2 "%%~f"

if %zzexiting% NEQ 0 exit /b %zzexiting%

echo %zzsuccess% file(s) processed.

if %zzdelayflag% EQU 0 goto :checksuccess
call :dodelay %zzdelayseconds%
if %zzexiting% NEQ 0 exit /b %zzexiting%
goto :restart


:checksuccess
rem:checksuccess

if %zzsuccess% NEQ 0 goto :restart

echo.
echo Failed to rename all existing files, exiting.
call :cleanexit
set zzexiting=7
exit /b %zzexiting%
goto :EOF


:work2
rem:work2

if %zzexiting% NEQ 0 exit /b %zzexiting%

set "zz_w1=%~1"
set zzdelayflag=0
echo.
echo Renaming file "%zz_w1%" to "%zzfinalname%"
ren "%zz_w1%" "%zzfinalname%">nul 2>&1
if exist "%zz_w1%" goto :renameerror
if not exist "%zzsourcepath%%zzfinalname%" goto :renameerror
goto :movefinalfile


:renameerror
rem:renameerror

echo Error: Failed to rename file "%zz_w1%" to "%zzfinalname%"
echo.

rem     Rename failed, skip it and get next file (immediately), if any.
goto :EOF


:movefinalfile
rem:movefinalfile

rem Rename success, move the file

if not exist "%zzdestpath%%zzfinalname%" goto :domove

call :waitexternal
if %zzexiting% NEQ 0 exit /b %zzexiting%
goto :movefinalfile


:domove
rem:domove

echo Moving file: "%zzsourcepath%%zzfinalname%" to "%zzdestpath%"
move "%zzsourcepath%%zzfinalname%" "%zzdestpath%">nul 2>&1
if exist "%zzsourcepath%%zzfinalname%" goto :moveerror
goto :movecomplete


:moveerror
rem:moveerror

echo Error: Failed to move file "%zz_w1%" to "%zzdestpath%%zzfinalname%"

rem     Move failed, restore (un-rename) file and skip it and get next file (immediately), if any.

for %%g in ("%zz_w1%") do set "zzt1=%%~nxg"
echo Restore file: "%zzsourcepath%%zzfinalname%" to "%zzt1%"
ren "%zzsourcepath%%zzfinalname%" "%zzt1%">nul 2>&1
echo.

goto :EOF


:movecomplete
rem:movecomplete

set /a zzsuccess+=1
call :dodelay %zzdelayseconds%
if %zzexiting% NEQ 0 exit /b %zzexiting%
rem echo.

rem     Go get next file, if any.
goto :EOF


:dodelay
rem:dodelay

set zztime=%1

if /I "%zzdelaytype%."=="P." goto :dopauseddelay

echo.
timeout /t %zztime%
goto :EOF


:dopauseddelay
rem:dopauseddelay

echo.
echo Waiting (%zztime% seconds) to process next file... You can wait to 
echo continue after delay or Q(uit) or C(ontinue) now.
choice /c cq /n /t %zztime% /d c /m "Press Q(uit) or C(ontinue now) or No Action (wait) to continue after delay. "
if %errorlevel% EQU 1 goto :EOF

echo.
echo User selected Q(uit), exiting.
call :cleanexit
set zzexiting=254
exit /b %zzexiting%
goto :EOF


:waitexternal
rem:waitexternal

echo.
echo Waiting for externl process...
call :dodelay %zzpartialdelay%
if %zzexiting% NEQ 0 exit /b %zzexiting%

goto :EOF


:cleanexit
rem:cleanexit

set "zzdelayflag="
set "zzdelayminutes="
set "zzdelayseconds="
set "zzdelaytype="
set "zzdestpath="
set "zzexiting="
set "zzfinalname="
set "zzmatchpattern="
set "zzpartialdelay="
set "zzsourcepath="
set "zzsuccess="
set "zzt1="
set "zzt2="
set "zztime="
set "zz_w1="

goto :EOF

この修正または説明が必要な場合は、お知らせください。


1
ダウン票は何のためだったのでしょうか...?
BDM

@ProfPickle-完璧なコメントを得るために+1-ありがとう。私が知っていれば、おそらくそれを修正することができました...しかし、現在のところ、私には手がかりがありません。まあ、いくつかのアップ、いくつかのダウン...それはすべて平均します。
ケビンフェガン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.