1

我正在尝试编写一个小批处理脚本,该脚本将从目录中删除文件旧文件。第一个参数是脚本要查看的目录,第二个参数是要保存的文件数。

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 是什么,它将跳过前几个文件,然后在 SafeNumber <= 0 时继续删除。

我现在遇到的问题是,如果文件名是“Test File.txt”(因为其中包含一个空格。“Test”作为 %1 而不是“Test File.txt”传递到删除中。

关于如何让我的脚本工作的任何想法,或者也许有人有更好的书面解决方案?

4

5 回答 5

2

您是否尝试在输入或脚本中的文件名周围加上引号?我的意思是脚本的 %f 或 %1 左右。

于 2009-07-27T20:51:29.480 回答
0

处理文件名中的空格等。您需要引用文件名和路径“%1”等。也许这是您唯一的问题。

于 2009-07-27T20:53:10.677 回答
0

您将不得不使用带有-newer 的find 命令,然后使用-exec rm。例如要删除比 file.txt 更新的所有文件,请执行以下操作:

find . -type f -newer file.txt -exec rm {} \;
于 2009-07-27T20:53:17.930 回答
0

很久以前,我编写了一个简单的 Java 程序,它应该从控制台启动,即从批处理文件启动。prog 从指定目录中删除旧文件。在这里查看,我实际上不记得它是如何工作的,但我建议先在测试文件夹上使用它。它应该用于Windows,至少在那里我使用它。

我现在切换到 Mac,我在每次启动时使用以下 Automator 脚本来完成这项工作:

find /Users/<yourUser>/Downloads/* -type f -mtime +90 -exec mv -f {} /Users/<yourUser>/.Trash \;
于 2009-07-27T20:59:30.617 回答
0

更改您的 for 循环,并取消您的删除功能。

for /f "skip=%safenum%" %%f in ('dir /o-d /a-d /b') do ( del %%f )

我对 for 循环有一种不健康的爱......

于 2013-03-14T22:05:13.270 回答