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



我正在尝试运行一个脚本来定期清理QNAP NAS上的回收站。问题是NAS上回收站的路径包含一个[at]符号:"\nas01\SQLBackup\@Recycle"(必须在此处使用双斜线才能正确显示(

有人能告诉我我做错了什么吗?

提前感谢您的帮助。

批处理文件代码

@ECHO ON
NET USE X: "\nas01SQLBackup@Recycle"
forfiles /p "X:" /s /m * /c "cmd /c del @path"
NET USE X: /delete
PAUSE

输出

C:Windowssystem32>NET USE X: "\nas01SQLBackup@Recycle"
The command completed successfully.

C:Windowssystem32>forfiles /p "X:" /s /m * /c "cmd /c del @path"
ERROR: Invalid argument/option - '@path'.
Type "FORFILES /?" for usage.
C:Windowssystem32>NET USE X: /delete
X: was deleted successfully.

C:Windowssystem32>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: "\nas01SQLBackup@Recycle"
pushd "x:">nul 2>&1 && del /Q /S *.* || echo X: Not available.
popd
net use X: /delete
pause

很简单,我们尝试pushdx:,如果不可用,它将失败并显示一条消息,如果可用,它会del /sX:上的所有内容,其中/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:somepath。当然,在您的特定情况下,您可以只删除X:周围的引号,但添加.是一种通用的解决方案,它甚至适用于像X:(意味着驱动器X:的当前目录(这样的相对路径,并且删除引号会给包含SPACEs的路径带来问题。


顺便问一下,你知道forfiles同时返回文件目录吗?del只删除文件,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 "\nas01SQLBackup@Recycle" 2> NUL && (RD /S /Q . 2> NUL & PopD)

本例使用RDR来删除D目录,而不是使用的Del命令。当目标目录是当前工作目录时,它不能被删除,(返回错误消息(,不管它的内容是什么。上面的代码将错误消息重定向到NUL设备,这样它就不会输出。

最新更新