在包含空格字符或其中一个字符的情况下,仅将参数字符串的一部分用双引号括起来是错误的&()[]{}^=;!'+,`~|<>
。最后 3 个字符不能用于文件/文件夹名称,只能用于其他参数字符串。
如果可执行main
文件的启动代码在全部。
请参阅批处理文件的答案:列出特定文件夹中的 rar 文件并将结果写入文本文件并回答如何使用空格设置环境变量?有关错误双引号参数字符串可能发生的情况的详细信息。
所以错误的是:
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搜索这些可执行文件。尽可能独立于这两个环境变量的当前值的批处理文件是在错误更新的系统 PATH上工作的批处理文件,例如,请参见为什么批处理文件中的命令“超时”突然不再起作用?
可以使用命令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 的提示
我认为在这里不使用TASKKILL/f
会更好。Internet Explorer 不应像使用 option 那样被操作系统杀死/F
。最好使用TASKKILL,否则/f
会导致向 IE 发送事件消息以关闭/退出/终止自身,IE 通常会处理并优雅地终止自身。当然,在执行下一个命令之前应该添加大约 1 到 2 秒的延迟,以给 IE 必要的时间来优雅地终止自身。
最佳解决方案是使用TASKKILL而不/f
向 IE 发送WM_CLOSE消息,等待 1 或 2 秒,检查IE 是否真的终止,否则使用TASKKILL来杀死操作系统/f
没有响应的 IE 进程。
最后,可能有多个 Internet Explorer 实例正在运行,因此最好使用TASKLIST来获取每个正在运行的 Internet Explorer 实例的进程标识符 (PID),如果有一个 IE 实例正在运行,则使用TASKKILL而不/F
打开每个使用 PID 运行的 IE 实例,在 1 到 2 秒后使用TASKLIST检查所有 IE 实例是否正常终止并且如果 1 个或多个 IE 实例仍在运行,请使用TASKKILL杀死/F
那些在 1 中没有响应的剩余 IE 实例到 2 秒,并自行终止。