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

Forfiles command : Use slashes instead of backslashes in directory path

我的脚本用于删除早于 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.

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

那么,是否可以对环境变量进行空格以便命令接受斜杠?或者您将如何在运行时将斜杠替换为反斜杠?

谢谢。

尝试variable search/replace喜欢:

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

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"

我会尝试

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