带有 [at] @ 符号的批处理文件路径

Batch File path with an [at] @ sign

我正在尝试 运行 一个脚本来定期清除 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 . . .

您收到错误的原因是路径周围有双引号,其中存在反斜杠。反斜杠转义最后一个双引号。您应该使用:

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

很简单,如果不可用,我们尝试 pushdx:\,它将失败并显示一条消息,如果可用,它将 del /s X:\ 上的所有内容,其中 /s 在这种情况下,基本上是遍历 X:\ 根的递归搜索。

路径中的 @-符号不会导致错误。它是反斜杠:

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:),并且删除引号会导致包含 SPACEs.

的路径出现问题

顺便问一下,您是否知道 forfiles returns 两个文件 目录,以及 del is there to delete just files, and there is rd 删除目录?

所以为了确保只处理文件,使用这个:

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)"

当您使用 PushD 时,它会创建一个临时驱动器映射,(按可用的反向字母顺序分配,Z:..A:,然后将使用该新驱动器。因此,您应该能够在不使用 net.exe.

的情况下执行此操作

示例:

@PushD "\nas01\SQLBackup\@Recycle" 2> NUL && (RD /S /Q . 2> NUL & PopD)

此示例使用 RDR 删除 D 目录而不是您使用的 Del 命令。当目标目录是当前工作目录时,它不能被删除,(返回一个错误信息),但是它的内容将会是。上面的代码将错误消息重定向到 NUL 设备,因此不会输出。