带有 [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
很简单,如果不可用,我们尝试 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:\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)
此示例使用 RD
来 R
删除 D
目录而不是您使用的 Del
命令。当目标目录是当前工作目录时,它不能被删除,(返回一个错误信息),但是它的内容将会是。上面的代码将错误消息重定向到 NUL
设备,因此不会输出。
我正在尝试 运行 一个脚本来定期清除 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
很简单,如果不可用,我们尝试 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:\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)
此示例使用 RD
来 R
删除 D
目录而不是您使用的 Del
命令。当目标目录是当前工作目录时,它不能被删除,(返回一个错误信息),但是它的内容将会是。上面的代码将错误消息重定向到 NUL
设备,因此不会输出。