Forfiles批处理脚本(转义@字符)

时间:2009-06-24 15:48:33

标签: batch-file forfiles

我正在处理一个批处理脚本,它允许我使用forfiles删除早于设定时段的文件。目前,我的目标是打印将要删除的文件。

我正在使用的forfiles调用从cmd.exe shell中完美运行,但是只要我将其嵌入到批处理脚本中,就会barfs。我怀疑这是因为@字符未被正确转义,但我不确定。

我正在运行的命令是:

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 \”的所有内容都没有结果。

任何帮助将不胜感激!

我还应该注意到,我基于来自here.

的forfiles的大部分知识。

8 个答案:

答案 0 :(得分:38)

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

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

希望有所帮助。

答案 1 :(得分:19)

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

答案 2 :(得分:3)

这是一个古老的问题,但我有一个不同的答案......万一有人需要它。

使用'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"

答案 3 :(得分:0)

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

以下示例删除了30天以内的某些txt文件 forfiles.exe /P c:\directory\ /M *.txt /C "cmd /c del @path" /d -30

答案 4 :(得分: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"

让“批处理文件”变得更加复杂。 :)

答案 5 :(得分: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批处理文件

答案 6 :(得分:0)

无法工作

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

DID WORK

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

小写的@path工作。

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

祝你好运!

答案 7 :(得分:0)

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

当替换变量包含尾部反斜杠时,会出现此问题。反斜杠&#39;逃脱&#39;引用,导致FORFILES错误地解释命令行的其余部分。

按照惯例,目录的路径不需要尾部反斜杠,这是根目录的一个例外。仅指定驱动器号和冒号C:不引用根 - 而是指当前目录&#39;为那个驱动器。要引用根,必须使用尾部反斜杠C:\

我的解决方案如下:

使用FORFILES时,请在结束前添加.&#34; /P参数的例如。

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

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

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

的影响