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

时间:2020-10-14 09:06:02

标签: batch-file special-characters

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

3 个答案:

答案 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

很简单,我们尝试pushdx:\如果不可用,它将失败并显示一条消息,如果可用,它将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)

此示例使用RDR删除D诱惑,而不是您使用的Del命令。当目标目录是当前工作目录时,无法将其删除,(返回错误消息),但是其内容将被删除。上面的代码将错误消息重定向到NUL设备,以便不输出错误消息。