【问题标题】:System Error 53 when mounting a network drive安装网络驱动器时出现系统错误 53
【发布时间】:2017-06-28 23:16:43
【问题描述】:

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

@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。感谢您的任何帮助,您可以提供。 附言我也试过直接从网络位置执行 PSExec

【问题讨论】:

  • cmd 窗口中net use M: \\ServerName\"R Share" 之后,驱动器出现在 explorer 中?在net use M: /delete 之后它会消失吗?如果重复上述过程结果是一样的吗?另外,错误是可重现的吗?直接从远程位置运行 psexec 会发生什么?
  • pushd \\ServerName\"R Share" 工作吗?
  • 免费回答:如果您将M: 映射到\\ServerName\"R Share",那么您应该尝试运行M:\PSExec\psexec.exe

标签: batch-file network-shares


【解决方案1】:

在包含空格字符或字符&()[]{}^=;!'+,`~|<> 之一时,将参数字符串的一部分用双引号括起来是错误的。最后 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 命令解释器不能使用本地环境变量 PATHPATHEXT。一个批处理文件尽可能独立于这两个环境变量的当前值是一个批处理文件也可以在错误更新的系统路径上工作,例如参见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

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

关于终止与杀死 IE 的提示

我认为在没有/f 的情况下使用 TASKKILL 会更好。 Internet Explorer 不应像使用选项/F 那样被操作系统杀死。最好在没有/f 的情况下使用 TASKKILL ,这会导致向 IE 发送事件消息以关闭/退出/终止自身,IE 通常会处理并优雅地终止自身。当然,在执行下一个命令之前应该添加大约 1 到 2 秒的延迟,以便 IE 有必要的时间来优雅地终止自身。

最佳解决方案是使用不带/fTASKKILL 向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 实例。

【讨论】:

    猜你喜欢
    • 2014-09-18
    • 2019-07-30
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2017-01-06
    • 1970-01-01
    相关资源
    最近更新 更多