Forfiles命令:在目录路径中使用斜杠而不是反斜杠

时间:2015-10-16 09:38:15

标签: windows batch-file backslash

我的脚本用于删除早于n天的日志文件。它在特定的上下文(Spring批处理)中调用,该环境先前已初始化了几个环境变量。

以下是脚本的内容:

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.

如果我手动用反斜杠写入路径,则命令成功。

那么,是否可以使用环境变量,以便命令接受斜杠?或者你将如何在运行时用反斜杠替换斜杠?

感谢。

3 个答案:

答案 0 :(得分: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命令引用的元素的完整路径时,删除变量中的引号(如果存在)并更正路径

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

因此,根据 MC ND 使用"%LOG_PATH:/=\%."中的引号和尾随点

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

答案 2 :(得分:1)

尝试使用variable search/replace

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