2015-10-16 131 views
0

我的脚本用于删除比n更早的日志文件。它在特定的上下文中被调用(Spring批处理),它已经初始化了几个环境变量。Forfiles命令:在目录路径中使用斜杠代替反斜杠

这里的脚本的内容:

set DAYS = 3 
forfiles /p %LOG_PATH% /s /d -%DAYS % /m *.* /c "cmd /c del @FILE" 

正如你所看到的,我没有的LOG_PATH值的控制。这是在其他地方初始化并包含用斜杠(而非反斜杠)像这样的路径:D:/DATA/LOGS

当我启动这个剧本我得到的,这个错误:The directory name is invalid.

如果我手动写反斜杠的路径命令成功。

因此,是否有可能espace环境变量,以便该命令接受斜杠?或者,你将如何继续在运行时替换反斜杠?

谢谢。

+0

注意,元素相反的是MS当路径修正docs说''forfiles'中的'/ m *。*'不匹配所有文件。它只会匹配名称有扩展名的文件。如果你想匹配*所有*文件,你需要'/ m *'。或者完全省略'/ m',因为'/ m *'是默认值。 – AnT

回答

4

我会尝试用

set "DAYS=3" 
forfiles /p "%LOG_PATH:/=\%." /s /d -%DAYS% /m *.* /c "cmd /c del @PATH" 

  • %LOG_PATH:/=\%会做斜杠反斜杠更换。
  • 附加引号用于处理空格或特殊字符的问题。
  • 如果变量包含结尾斜线,则在结尾处有一个额外的点以避免问题,该点将转换为反斜杠并将转义引号。
  • 可变%DAYS%定义修改,删除名称和值
  • forfiles /s空间请求递归搜索,并@FILE只能检索名称和文件的扩展名,所以它更改为@PATH,以确保代码将只删除发现的文件超出当前活动目录。

如果你没有对%LOG_PATH%内容控制和不知道的变量包含引号,再次引用变量可能会导致更多的问题。一个更安全的版本可能是

set "DAYS=3" 
for %%a in ("%LOG_PATH:"=%.") do (
    forfiles /p "%%~fa" /s /d -%DAYS% /m *.* /c "cmd /c del @PATH" 
) 

凡在变量引号(如果存在)被删除,请求的完整路径由for命令引用

+0

非常感谢,该变量可能包含引号,所以我会使用您的安全版本!虽然,我不太清楚我是否理解'@ FILE'和'@ PATH'之间的区别。我以前的脚本是否从子目录中删除文件,而你的文件不? – Thrax

+0

@Thrax,[文档](https://technet.microsoft.com/en-us/library/cc753551%28v=ws.10%29.aspx)说'@ FILE'只是文件名和'@PATH '包含文件的完整路径。从理论上讲,当前活动目录被设置为'forfiles'迭代的目录,以便在该目录内执行指定的命令,所以不会有任何区别,只是为了防止出现问题(我们在这里删除文件),我习惯于准确地说明代码应该做什么。虽然可能根本不需要,但表明完整的路径更安全。只是一种习惯。 –

+0

是的,我正在阅读文档,看看是否可以在没有找到文件(我设法执行)的情况下抑制'ERRORLEVEL',并且如果我可以回显删除的文件数量(仍在工作)。再次感谢! – Thrax

1

尝试variable search/replace像:

set DAYS = 3 
forfiles /p %LOG_PATH:/=\% /s /d -%DAYS % /m *.* /c "cmd /c del @FILE" 
+0

感谢您的帮助! – Thrax

2

Variable Edit/Replace

==> set "LOG_PATH=D:/DATA/LOGS" 

==> echo %LOG_PATH%  %LOG_PATH:/=\% 
D:/DATA/LOGS  D:\DATA\LOGS 

==> 

一些错误:

  v this space 
set DAYS = 3             
forfiles /p %LOG_PATH% /s /d -%DAYS % /m *.* /c "cmd /c del @FILE" 
          ^^^^^^^^^^^      ^^^^^ 
       results to /d - 3       use fully qualified @PATH 
          ^this space     

因此,使用(报价和尾随点在"%LOG_PATH:/=\%."凭借MC ND的)

set "DAYS=3" 
forfiles /p "%LOG_PATH:/=\%." /s /d -%DAYS% /m *.* /c "cmd /c del @PATH" 
+0

感谢您的帮助! – Thrax