ディレクトリから最新のファイルをコピーする Windows バッチ スクリプトを作成するにはどうすればよいですか?
-
01-07-2019 - |
解決
Windows シェル、ワンライナー:
FOR /F %%I IN ('DIR *.* /B /O:-D') DO COPY %%I <<NewDir>> & EXIT
他のヒント
受け入れられた回答には、コマンドで最新のファイルを使用して終了する例が示されています。他の複雑な操作とともにこれをバット ファイルで実行する必要がある場合は、次のコマンドを使用して最新のファイルのファイル名を変数に保存できます。
FOR /F "delims=|" %%I IN ('DIR "*.*" /B /O:D') DO SET NewestFile=%%I
これで、バット ファイルの残りの部分全体で %NewestFile% を参照できるようになります。
たとえば、データベースの .bak ファイルの最新バージョンをディレクトリから取得し、サーバーにコピーして、データベースを復元するために使用するものは次のとおりです。
:Variables
SET DatabaseBackupPath=\\virtualserver1\Database Backups
echo.
echo Restore WebServer Database
FOR /F "delims=|" %%I IN ('DIR "%DatabaseBackupPath%\WebServer\*.bak" /B /O:D') DO SET NewestFile=%%I
copy "%DatabaseBackupPath%\WebServer\%NewestFile%" "D:\"
sqlcmd -U <username> -P <password> -d master -Q ^
"RESTORE DATABASE [ExampleDatabaseName] ^
FROM DISK = N'D:\%NewestFile%' ^
WITH FILE = 1, ^
MOVE N'Example_CS' TO N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Example.mdf', ^
MOVE N'Example_CS_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Example_1.LDF', ^
NOUNLOAD, STATS = 10"
これがスペースを使用したファイル名で機能できるようにするには、受け入れられた回答の修正バージョンが必要です。
FOR /F "delims=" %%I IN ('DIR . /B /O:-D') DO COPY "%%I" <<NewDir>> & GOTO :END
:END
@クリス・ノエ
& の前のスペースは前のコマンドの一部になることに注意してください。これは、値の末尾の空白を喜んで挿入する SET のことで私を悩ませました。
環境変数に追加される末尾のスペースを回避するには、set コマンドを括弧で囲みます。
例えば。 FOR /F %%I IN ('DIR "*.*" /B /O:D') DO (SET NewestFile=%%I)
Windows について質問したのはわかっていますが、とにかくこれを追加しようと思いました。Unix/Linux では次のようにできます。
cp `ls -t1 | head -1` /somedir/
これは、現在のディレクトリ内のすべてのファイルを変更時間順にリストし、最新のものを /somedir/ にコピーします。
これにより、2 番目の cmd.exe ウィンドウが開きます。これをなくしたい場合は、/K を /C に置き換えます。
明らかに、 new_file_loc を新しいファイルの場所に置き換えてください。
@echo off
for /F %%i in ('dir /B /O:-D *.txt') do (
call :open "%%i"
exit /B 0
)
:open
start "window title" "cmd /K copy %~1 new_file_loc"
exit /B 0
@echo off
set source="C:\test case"
set target="C:\Users\Alexander\Desktop\random folder"
FOR /F "delims=" %%I IN ('DIR %source%\*.* /A:-D /O:-D /B') DO COPY %source%\"%%I" %target% & echo %%I & GOTO :END
:END
TIMEOUT 4
フォルダーから最新のファイルをコピーしようとしました
ソースフォルダーとターゲットフォルダーを設定するだけで機能するはずです
これはフォルダーを無視し、ファイルのみを考慮します
DIR パス変更時にファイルタイプを選択することをお勧めします *.*
に *.zip
例えば
winXPではTIMEOUTは動作しないと思います
バッシュ:
find -type f -printf "%T@ %p \n" \
| sort \
| tail -n 1 \
| sed -r "s/^\S+\s//;s/\s*$//" \
| xargs -iSTR cp STR newestfile
ここで、「最新ファイル」は最新のファイルになります。
あるいは、 newdir/STR または単に newdir を実行することもできます
壊す:
- すべてのファイルを {time} {file} 形式でリストします。
- 時間順に並べ替える
- 最後の1つを手に入れる
- 時間を切り取り、開始/終了の空白を削除する
- 結果の値をコピーする
重要
これを一度実行すると、最新のファイルはコピーしたばかりのファイルになります:p (両方とも同じ検索範囲内にあると仮定します)。したがって、これを複数回実行したい場合は、コピーするファイル番号を調整する必要があるかもしれません。