在包含空格字符或字符&()[]{}^=;!'+,`~|<> 之一时,将参数字符串的一部分用双引号括起来是错误的。最后 3 个字符不能用于文件/文件夹名称,只能用于其他参数字符串。
Windows 命令解释器相应的可执行文件的启动代码(= 在main 解析命令行字符串之前运行的可执行文件的代码)必须做很多额外的工作来自动纠正错误的引用参数字符串,如果可执行文件的启动代码确实如此完全是这样的自动更正。
请参阅batch file: list rar file in specific folder and write result into text file 上的答案和How to set environment variables with spaces? 上的答案,详细了解错误双引号参数字符串会发生什么。
错的是:
net use M: \\ServerName\"R Share"
正确的是:
net use M: "\\ServerName\R Share"
参数 0 是 net,参数 1 是 use,参数 2 是 M:,参数 3 是 "\\ServerName\R Share"。
但是,net.exe 有一个启动代码,它将 \\ServerName\"R Share" 自动更正为 \\ServerName\R Share。所以这不是导致系统错误 53 消息的编码错误。
系统错误 53 是由将 \\ServerName\R Share 分配给驱动器号 M: 并使用 next 引起的:
M:\"R Share"\PSExec\psexec.exe
分享R Share 已包含在M: 中。所以正确的行是:
"M:\PSExec\psexec.exe"
应用了更正的整个批次代码:
@echo off
echo Mounting ServerName as local drive
%SystemRoot%\System32\net.exe use M: "\\ServerName\R Share"
echo Clearing IE Cache
%SystemRoot%\System32\taskkill.exe /im iexplore.exe /f
"M:\PSExec\psexec.exe" -l c:\windows\system32\RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 32
echo Removing ServerName
%SystemRoot%\System32\net.exe use M: /delete
echo IE Cleared
pause
最好在 Windows 系统目录中使用完整路径和文件扩展名指定可执行文件,因为 Windows 命令解释器不能使用本地环境变量 PATH 和 PATHEXT。一个批处理文件尽可能独立于这两个环境变量的当前值是一个批处理文件也可以在错误更新的系统路径上工作,例如参见Why does the command "Timeout" in a batch file suddenly not work anymore?
此批处理代码可以通过使用命令 PUSHD 进行优化,该命令将当前目录路径推入堆栈并将指定目录设置为当前目录,从而启用命令扩展后,UNC 路径将自动映射到下一个空闲驱动器号。默认情况下启用命令扩展,但当然可以显式启用它们以确保安全。命令 POPD 删除由 PUSHD 完成的映射,并将当前目录设置回之前在堆栈上推送的目录。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
pushd "\\ServerName\R Share"
%SystemRoot%\System32\taskkill.exe /im iexplore.exe /f
echo Current directory is: %CD%
PSExec\psexec.exe -l c:\windows\system32\RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 32
popd
echo IE Cleared
endlocal
pause
注意: PUSHD 和 POPD 如果还必须在命令行上使用用户名和/或密码才能成功,则不能使用将网络共享映射到驱动器号并访问该共享上的目录和文件,因为批处理文件正在使用不需要网络共享访问权限的用户帐户运行。
关于终止与杀死 IE 的提示
我认为在没有/f 的情况下使用 TASKKILL 会更好。 Internet Explorer 不应像使用选项/F 那样被操作系统杀死。最好在没有/f 的情况下使用 TASKKILL ,这会导致向 IE 发送事件消息以关闭/退出/终止自身,IE 通常会处理并优雅地终止自身。当然,在执行下一个命令之前应该添加大约 1 到 2 秒的延迟,以便 IE 有必要的时间来优雅地终止自身。
最佳解决方案是使用不带/f 的TASKKILL 向IE 发送WM_CLOSE 消息,等待1 或2 秒,如果IE 真的使用TASKLIST终止并以其他方式使用 TASKKILL 和 /f 来杀死操作系统没有响应的 IE 进程。
最后,可能有多个 Internet Explorer 实例正在运行,因此最好使用 TASKLIST 来获取每个正在运行的 Internet Explorer 实例的进程标识符 (PID) IE 实例完全运行,使用 TASKKILL 不使用 /F 在每个使用 PID 的 IE 运行实例上,在 1 到 2 秒后使用 TASKLIST 检查所有 IE 实例是否正常终止如果 1 个或多个 IE 实例仍在运行,请使用 TASKKILL 和 /F 来杀死那些在 1 到 2 秒内没有响应并自行终止的剩余 IE 实例。