我正在处理一个批处理脚本,它允许我使用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的大部分知识。答案 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"
将.dat和.csv文件替换为您要删除的内容。
-50删除旧版本50天
这是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
似乎不受添加.