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.
如果我手动写反斜杠路径,命令成功。
那么,是否可以对环境变量进行空格以便命令接受斜杠?或者您将如何在运行时将斜杠替换为反斜杠?
谢谢。
set DAYS = 3
forfiles /p %LOG_PATH:/=\% /s /d -%DAYS % /m *.* /c "cmd /c del @FILE"
==> 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
命令引用的元素的完整路径时删除变量中的引号(如果存在)并更正路径
我的脚本用于删除早于 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.
如果我手动写反斜杠路径,命令成功。
那么,是否可以对环境变量进行空格以便命令接受斜杠?或者您将如何在运行时将斜杠替换为反斜杠?
谢谢。
set DAYS = 3
forfiles /p %LOG_PATH:/=\% /s /d -%DAYS % /m *.* /c "cmd /c del @FILE"
==> 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
命令引用的元素的完整路径时删除变量中的引号(如果存在)并更正路径