21

我正在开发一个批处理脚本,它可以让我使用forfiles删除比设定时间更早的文件。现在,我的目标是打印将被删除的文件。

我正在使用的 forfiles 调用可以在 cmd.exe shell 中完美运行,但是一旦我将它嵌入到批处理脚本中,它就会出错。我怀疑这是由于 @ 字符没有被正确转义,但我不确定。

我正在运行的命令是:

forfiles /S /P "r:\" /m *.bak /d -10 /c "cmd /c echo @PATH"

它会导致以下错误:

ERROR: Invalid argument/option - '@PATH'
Type "FORFILES /?" for usage.

我到处搜索并尝试了几种不同的方案来转义@PATH 组件。从@@PATH\"@PATH\"的所有内容都没有结果。

任何帮助,将不胜感激!

我还应该注意,我从这里获得了很多关于 forfiles 的知识。

4

8 回答 8

47

在删除目录路径周围的引号之前,我遇到了同样的问题,如下所示:

forfiles /S /P r:\ /m *.bak /d -10 /c "cmd /c echo @PATH"

希望有帮助。

于 2009-06-24T15:59:00.307 回答
26

尝试修剪路径的尾随\/P然后您应该能够使用引号来封装包含空格的路径。

于 2011-12-06T13:10:33.900 回答
4

这是一个老问题,但我有一个不同的答案……以防万一有人需要。

当使用'forfiles'时,路径(写在/p之后)可以在引号之间。但是,它不能以斜线结尾。

如果要为驱动器的根目录运行“forfiles”:
forfiles /p "C:" /c "cmd /c echo @file"

如果要处理不同目录中的文件...
forfiles /p "C:\Program Files" /c "cmd /c echo @file"

换句话说,最安全的方法是:

  • 始终使用引号(因为带有空格的文件夹,例如“程序文件”,仍然可以使用)
  • 始终省略最后一个斜杠

forfiles /p "C:\Path\Without\Trailing\Slash"

于 2012-11-30T10:06:16.900 回答
2

最佳做法是在路径 (/P) 参数周围使用双引号来处理带有空格的路径。

当替换变量包含尾部反斜杠时会出现此问题。反斜杠“转义”引号,导致 FORFILES 错误解释命令行的其余部分。

按照惯例,目录的路径不需要尾部反斜杠,一个例外是根目录。仅指定驱动器号和冒号C:并不是指根目录,而是指该驱动器的“当前目录”。要引用根,必须使用尾部反斜杠C:\

我的解决方案如下:

使用 FORFILES 时,.在参数的关闭 " 之前附加一个,/P例如

FORFILES /P "%somePath%." /C "CMD /C ECHO @path"

替换后,这会导致形式C:\.C:\TEMP.或的路径C:\TEMP\.。所有这些都被 FORFILES 和 DIR 正确处理。

我没有测试所有可能的 FORFILES 替换变量,但@path似乎不受添加.

于 2015-02-19T00:50:16.027 回答
0
dir *.* > C:\path\dummy%date:~4,2%%date:~7,2%%date:~10,4%.DAT

dir *.* > C:\path\dummy%date:~4,2%%date:~7,2%%date:~10,4%.csv

forfiles -p C:\path\ -m *.DAT /d -50 /c "cmd /c del /Q @path"
forfiles -p C:\path\ -m *.csv /d -50 /c "cmd /c del /Q @path"
  1. 替换您要删除的 .dat 和 .csv 文件。

  2. -50 删除超过 50 天

  3. 这是windows批处理文件

于 2013-02-22T10:19:51.883 回答
0

让它正常工作,否则当你使用批处理文件时forfiles.exe它不会通过。@variables如果您在命令提示符下,Forfiles 将起作用,但是当您在批处理文件中运行它时,变量将无法正常工作,除非您输入: forfiles.exe.

这是一个删除一些超过 30 天的 txt 文件的示例 forfiles.exe /P c:\directory\ /M *.txt /C "cmd /c del @path" /d -30

于 2011-08-16T18:59:47.140 回答
0

我发现 FORFILES 有两​​个版本,一个是 1998 版本(感谢 Emmanuel Boersma),另一个是 2005 版本(修改日期时间显示它)。

FORFILES v 1.1 - by Emmanuel Boersma - 4/98

Syntax : FORFILES [-pPath] [-mSearch Mask] [-ccommand] [-dDDMMYY] [-s]

 -pPath             Path where to start searching
 -mSearch Mask      Search files according to <Search Mask>
 -cCommand          Command to execute on each file(s)
 -d[+|-][DDMMYY|DD] Select files with date >= or <=DDMMYY (UTC)
                    or files having date >= or <= (current date - DD days)
 -s                 Recurse directories
 -v                 Verbose mode

The following variables can be used in Command :
 @FILE, @PATH, @RELPATH, @ISDIR, @FSIZE, @FDATE, @FTIME

Default : <Directory : .> <Search Mask : *.*>  <Command : "CMD /C Echo @FILE">
Examples :
FORFILES -pc:\ -s -m*.BAT -c"CMD /C Echo @FILE is a batch file"
FORFILES -pc:\ -s -m*.* -c"CMD /C if @ISDIR==TRUE echo @FILE is a directory"
FORFILES -pc:\ -s -m*.* -d-100 -c"CMD /C Echo @FILE : date >= 100 days"
FORFILES -pc:\ -s -m*.* -d-010193 -c"CMD /C Echo @FILE is quite old!"

每个版本都有其独特的语法。

FORFILES [/P pathname] [/M searchmask] [/S]
         [/C command] [/D [+ | -] {MM/dd/yyyy | dd}]

Description:
    Selects a file (or set of files) and executes a
    command on that file. This is helpful for batch jobs.

Parameter List:
    /P    pathname      Indicates the path to start searching.
                        The default folder is the current working
                        directory (.).

    /M    searchmask    Searches files according to a searchmask.
                        The default searchmask is '*' .

    /S                  Instructs forfiles to recurse into
                        subdirectories. Like "DIR /S".

    /C    command       Indicates the command to execute for each file.
                        Command strings should be wrapped in double
                        quotes.

                        The default command is "cmd /c echo @file".

                        The following variables can be used in the
                        command string:
                        @file    - returns the name of the file.
                        @fname   - returns the file name without
                                   extension.
                        @ext     - returns only the extension of the
                                   file.
                        @path    - returns the full path of the file.
                        @relpath - returns the relative path of the
                                   file.
                        @isdir   - returns "TRUE" if a file type is
                                   a directory, and "FALSE" for files.
                        @fsize   - returns the size of the file in
                                   bytes.
                        @fdate   - returns the last modified date of the
                                   file.
                        @ftime   - returns the last modified time of the
                                   file.

                        To include special characters in the command
                        line, use the hexadecimal code for the character
                        in 0xHH format (ex. 0x09 for tab). Internal
                        CMD.exe commands should be preceded with
                        "cmd /c".

    /D    date          Selects files with a last modified date greater
                        than or equal to (+), or less than or equal to
                        (-), the specified date using the
                        "MM/dd/yyyy" format; or selects files with a
                        last modified date greater than or equal to (+)
                        the current date plus "dd" days, or less than or
                        equal to (-) the current date minus "dd" days. A
                        valid "dd" number of days can be any number in
                        the range of 0 - 32768.
                        "+" is taken as default sign if not specified.

    /?                  Displays this help message.

Examples:
    FORFILES /?
    FORFILES
    FORFILES /P C:\WINDOWS /S /M DNS*.*
    FORFILES /S /M *.txt /C "cmd /c type @file | more"
    FORFILES /P C:\ /S /M *.bat
    FORFILES /D -30 /M *.exe
             /C "cmd /c echo @path 0x09 was changed 30 days ago"
    FORFILES /D 01/01/2001
             /C "cmd /c echo @fname is new since Jan 1st 2001"
    FORFILES /D +3/19/2012 /C "cmd /c echo @fname is new today"
    FORFILES /M *.exe /D +1
    FORFILES /S /M *.doc /C "cmd /c echo @fsize"
    FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"

玩得开心,让“批处理文件”更复杂。:)

于 2012-03-19T10:18:15.840 回答
0

不工作

FORFILES /P %deletepath% /M *.%extension% /D -%days% /C "cmd /c del @PATH"

工作了

FORFILES /P %deletepath% /M *.%extension% /D -%days% /C "cmd /c del @path"

小写的@path 有效。

在到处搜索之后,我在自己的测试中找到了答案。使用服务器 2012 R2 上的最新版本,我尝试将 @PATH 更改为小写。这为我修好了。

祝你好运!

于 2014-09-26T05:46:03.100 回答