DIRの結果を使用するためのバッチスクリプト、
-
19-09-2019 - |
質問
私は、ディレクトリからファイルに古いファイルを削除します小さなバッチスクリプトを書くことをしようとしています。 最初のパラメータはに見てスクリプトのディレクトリであり、第二は、保存するファイルの数です。
rem @ECHO OFF
rem %1 is the path in which to look for the files
rem %2 is the number of recent files to preserve
if [%1] EQU [] (
echo ERROR: Missing Required Paramater directory path.
goto :eof
)
if [%2] EQU [] (
echo ERROR: Missing Required Paramater, number of files to preserve
goto :eof
)
if %2 LSS 0 (
echo ERROR: Number of files to preserve provided was negative
goto :eof
)
set FolderPath=%1
set SafeNumber=%2
cd %FolderPath%
for /f %%f in ('dir /O-D /A-D /B') do call :delete %%f
goto :eof
:delete
if %SafeNumber% LEQ 0 (
del %1
) else (
set /a SafeNumber-=1
)
goto :eof
:eof
基本的に私はここに持っていることは、最新から最古に注文したファイル名のリストを出力ディレクトリです。 SafeNumberが何であるかに応じて、最初のいくつかのファイルをスキップし、その後、削除してprocede SafeNumber一度<= 0。
スペースが含まれているのようにファイル名が(「テストFILE.TXT」である場合は、私が今抱えている問題は、ある。「テスト」には、%1というし、「テストFILE.TXT」を削除に渡されますます。
働く私のスクリプトを取得する方法上の任意のアイデアを、または、おそらく誰かがより良い書かれた解決策を持っている?
解決
あなたの入力で、またはスクリプトでファイル名を囲む引用符を入れてみましたか?私は、スクリプトのは%fまたは%1、周りを意味します。
他のヒント
など、ファイル名に空白文字を処理するには。あなたがなどのファイル名とパス「%1」のために引用することをお勧めします....多分それはあなたの唯一の問題である。
あなたは-newer、その後-exec RMでfindコマンドを使用しているつもり。
:たとえばfile.txtをが何よりも新しいすべてのファイルを削除するにはfind . -type f -newer file.txt -exec rm {} \;
昔、私は、バッチファイルから、すなわち、コンソールから起動されるようになっている単純なJava PROGを書きました。 progが指定されたディレクトリから古いファイルを削除します。それをチェックアウトここを、私は実際ドン「Tは、それがどのように動作するかを正確に覚えていますが、私は、テスト・フォルダに最初にそれを使用してお勧めします。私はそれを使用する場所、それが、少なくともそこに、Windowsのために使用されることを想定している。
私は今、私はその仕事をしているため、各ブート時に起動し、次のAutomatorスクリプトを使用しているマックに切り替えます:
find /Users/<yourUser>/Downloads/* -type f -mtime +90 -exec mv -f {} /Users/<yourUser>/.Trash \;
ループのためにあなたを変更し、あなたの削除機能を廃止ます。
for /f "skip=%safenum%" %%f in ('dir /o-d /a-d /b') do ( del %%f )
私はforループの不健康な愛を持っている...