批处理文件在 Win10 上的行为异常

批处理文件在 Win10 上的行为异常

我创建了以下.bat 文件来清除 Windows 10 的预取和临时文件夹:

cd %systemroot%\Prefetch
del /q /s *.*
cd %temp%
del /q /s *.*

现在,在我的系统上,无论我从哪里执行该文件,它都能按预期运行。然而,在另一个系统(也是 Win10)上,从桌面执行脚本会删除桌面文件夹(C:\Users\\Desktop)中所有内容。

现在我完全不知道这是怎么回事。如果能给出解释我将不胜感激。另外,我想没有有效的方法可以恢复以这种方式删除的数据吧?

谢谢。

编辑:我意识到当第一个文件夹不存在时从桌面运行脚本会调用桌面目录上的删除,但文件夹确实存在。

答案1

这里有几种可能性。%temp% 可能被设置为用户的桌面文件夹。另一个原因可能是,在第一个命令中,用户没有权限,因此不会更改路径。

如果脚本从桌面运行,它将不会改变文件夹,因此它会删除这些文件。

如果您想保护您的脚本免受此类问题的困扰,请构建一个 IF 语句来检查 %cd% 是否与您实际想要的文件夹相同。

另请注意,使用 cd 更改目录不会同时更改驱动器,除非您附加 /d。以下是没有 /d 和有 /d 时的情况。

C:\>d:

D:\>cd c:\temp

D:\>c:

C:\temp>cd /d d:\games

D:\Games>

如您所见,没有 /d 它会更改目录,但不会更改驱动器。您可以键入 d: 和 c: 进行切换,但在脚本中使用 /d 时,您始终可以确定驱动器也会更改。

也就是说,你的脚本看起来应该是这样的:

@echo off

cd /d %systemroot%\Prefetch

IF %cd%==%systemroot%\Prefetch (
    del /q /s *.*
) ELSE (
    echo "The script was unable to switch to the folder %systemroot%\Prefetch."
)

cd /d %temp%

IF %cd%==%temp%  (
    del /q /s *.*
) ELSE (
    echo "The script was unable to switch to the folder %temp%."
)

答案2

您应该注意,该cd命令仅更改目录,而不会更改当前驱动器。虽然 Unix 只有一个当前目录,但 DOS/Windows 每个驱动器都有一个当前目录。因此,如果您的初始目录和目标目录位于不同的驱动器上,您将获得完全相同的效果。

C:\Users\name\Desktop>cd D:\WINDOWS\Prefetch
C:\Users\name\Desktop>del /q /s *.*

第一个命令执行后当前驱动器仍然存在C:,而驱动器的当前目录D:已更改为D:\WINDOWS\Prefetch,因此第二个命令将会删除C:\Users\name\Desktop,而不是D:\WINDOWS\Prefetch

由于目录不存在,该命令也可能失败。

一个简单的解决方案是不要将命令分成两部分,而是使用单个命令:

del /q /s %systemroot%\Prefetch\*.*
del /q /s %temp%\*.*

相关内容