我正在尝试运行脚本来定期清除QNAP NAS上的回收站。 问题是NAS上的回收站路径包含[at]符号: “ \ nas01 \ SQLBackup \ @Recycle”(必须在此处使用双斜杠才能使其正确显示)
有人可以向我指出我做错了什么吗?
预先感谢您的帮助。
批处理文件代码
@ECHO ON
NET USE X: "\\nas01\SQLBackup\@Recycle"
forfiles /p "X:\" /s /m * /c "cmd /c del @path"
NET USE X: /delete
PAUSE
输出
C:\Windows\system32>NET USE X: "\\nas01\SQLBackup\@Recycle"
The command completed successfully.
C:\Windows\system32>forfiles /p "X:\" /s /m * /c "cmd /c del @path"
ERROR: Invalid argument/option - '@path'.
Type "FORFILES /?" for usage.
C:\Windows\system32>NET USE X: /delete
X: was deleted successfully.
C:\Windows\system32>PAUSE
Press any key to continue . . .
答案 0 :(得分:0)
出现错误的原因是由于路径中出现反斜杠的双引号引起的。反斜杠转义最后一个双引号。您应该使用:
forfiles /p "X:" /s /m * /c "cmd /c del @path"
或
forfiles /p X:\ /s /m * /c "cmd /c del @path"
无论如何,我根本不会在这里使用forfiles
。您可以非常简单地使用del /s
:
net use X: "\\nas01\SQLBackup\@Recycle"
pushd "x:\">nul 2>&1 && del /Q /S *.* || echo X:\ Not available.
popd
net use X: /delete
pause
很简单,我们尝试pushd
到x:\
如果不可用,它将失败并显示一条消息,如果可用,它将del /s
X:\
上的所有内容{{1 }}在这种情况下基本上是遍历/s
根的递归搜索。
答案 1 :(得分:0)
路径中的@
符号不会引起错误。它是反斜杠:
forfiles /p "X:\" /s /m * /c "cmd /c del @path"
无意中跳过了右引号(这是forfiles
特有的!)。为避免这种情况,只需在路径后附加.
,例如:
forfiles /p "X:\." /s /m * /c "cmd /c del @path"
.
表示当前目录,因此在路径中它不会改变任何内容,因此X:\
等于X:\.
,而D:\some\.\path
等于D:\some\path
。当然,您可以在特定情况下删除X:\
周围的引号,但是附加.
是一种通用解决方案,甚至可以使用类似X:
的相对路径(表示当前目录驱动器X:
),删除引号会导致包含 SPACE 的路径出现问题。
顺便说一句,您是否知道forfiles
返回文件和目录,并且del
在那里仅删除文件,并且有{{3} }删除目录?
因此,要确保仅处理文件,请使用以下命令:
forfiles /S /P "X:\." /M * /C "cmd /C if @isdir==FALSE del @path"
要确保仅处理目录,请使用以下命令:
forfiles /S /P "X:\." /M * /C "cmd /C if @isdir==TRUE rd /S /Q @path"
当然,您可以同时处理这两个问题
forfiles /S /P "X:\." /M * /C "cmd /C if @isdir==TRUE (rd /S /Q @path) else (del @path)"
答案 2 :(得分:0)
使用PushD
时,它将创建一个临时驱动器映射(按可用的反向字母顺序分配,Z:
.. A:
),然后然后将使用该新驱动器。因此,您无需使用net.exe
就可以做到这一点。
示例:
@PushD "\\nas01\SQLBackup\@Recycle" 2> NUL && (RD /S /Q . 2> NUL & PopD)
此示例使用RD
来R
删除D
诱惑,而不是您使用的Del
命令。当目标目录是当前工作目录时,无法将其删除,(返回错误消息),但是其内容将被删除。上面的代码将错误消息重定向到NUL
设备,以便不输出错误消息。