2

大家好,第一次发帖,寻找我无法正常工作的批处理文件的评论:

@echo Mounting ServerName as local drive
net use M: \\ServerName\"R Share"
@echo Clearing IE Cache
taskkill /im iexplore.exe /f
M:\"R Share"\PSExec\psexec.exe -l c:\windows\system32\RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 32
@echo Removing ServerName
@net use M: /delete
@echo IE Cleared
@pause

该脚本的要点是将共享挂载为驱动器,关闭所有打开的 IE 窗口,然后运行 ​​psexec 以清除 IE 保存的凭据,然后卸载驱动器。最初尝试安装驱动器时,我一直遇到系统错误 53,并希望确保我的代码中没有遗漏任何内容。我尝试使用机器的名称和 IP 来安装驱动器,无论哪种方式,即使在资源管理器中可以访问共享,我仍然会遇到 SysError 53。感谢您的任何帮助,您可以提供。PS 我也尝试直接从网络位置执行 PSExec

4

1 回答 1

1

在包含空格字符或其中一个字符的情况下,仅将参数字符串的一部分用双引号括起来是错误的&()[]{}^=;!'+,`~|<>。最后 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 命令解释器不得使用本地环境变量PATHPATHEXT搜索这些可执行文件。尽可能独立于这两个环境变量的当前值的批处理文件是在错误更新的系统 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

注意: 如果还必须在命令行上使用用户名和/或密码以成功将网络共享映射到驱动器号并访问该共享上的目录和文件,则不能使用PUSHDPOPD ,因为批处理文件正在运行没有网络共享所需访问权限的用户帐户。

关于终止与终止 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 秒,并自行终止。

于 2017-06-29T06:06:21.987 回答