我的脚本用于删除早于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.
如果我手动用反斜杠写入路径,则命令成功。
那么,是否可以使用环境变量,以便命令接受斜杠?或者你将如何在运行时用反斜杠替换斜杠?
感谢。
答案 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)
==> 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)
set DAYS = 3
forfiles /p %LOG_PATH:/=\% /s /d -%DAYS % /m *.* /c "cmd /c del @FILE"