我正在尝试运行一个脚本来定期清理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
很简单,我们尝试pushd
到x:
,如果不可用,它将失败并显示一条消息,如果可用,它会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: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)
本例使用RD
到R
来删除D
目录,而不是使用的Del
命令。当目标目录是当前工作目录时,它不能被删除,(返回错误消息(,不管它的内容是什么。上面的代码将错误消息重定向到NUL
设备,这样它就不会输出。