安装网络驱动器时出现系统错误 53

System Error 53 when mounting a network drive

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

@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 windows,然后 运行 psexec 清除 IE 保存的凭据,然后卸载驱动器。我在最初尝试安装驱动器时一直 运行ning 进入系统错误 53,并想确保我的代码中没有遗漏任何内容。我尝试使用机器的名称和 IP 安装驱动器,无论哪种方式,我仍然 运行 进入 SysError 53,即使在资源管理器中可以访问共享。感谢您的任何帮助,您可以提供。 P.S。我还尝试直接从网络位置执行 PSExec

在包含 space 字符或其中一个字符 &()[]{}^=;!'+,`~|<> 时,仅将参数字符串的一部分用双引号引起来是错误的。最后 3 个字符不能用在 file/folder 名称中,只能用在其他参数字符串中。

Windows命令解释器分别是可执行文件的启动代码(=可执行文件运行在main解析命令行字符串之前的代码)必须做很多额外的工作才能自动纠正如果可执行文件的启动代码根本没有进行此类自动更正,则引用错误的参数字符串。

查看 batch file: list rar file in specific folder and write result into text file and answer on 上的答案,详细了解错误双引号参数字符串可能发生的情况。

所以错的是:

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。尽可能独立于这两个环境变量的当前值的批处理文件是一个批处理文件,它也适用于错误更新的 system PATH,例如参见 [​​=37=]

可以使用命令 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如果用户名and/or 密码也必须在命令行上使用才能成功将网络共享映射到驱动器号并访问该共享上的目录和文件,因为批处理文件是 运行 一个没有网络共享所需访问权限的用户帐户.

关于终止和杀死 IE 的提示

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

最佳解决方案是使用 TASKKILL 而不使用 /f 向 IE 发送 WM_CLOSE 消息,等待 1 或 2 秒,检查 TASKLIST 如果 IE 真的终止了,否则使用 TASKKILL/f 来杀死操作系统没有响应的 IE 进程。

最后,Internet Explorer 的多个实例可能 运行ning,因此最好使用 TASKLIST 来获取进程标识符 (PID)每个 运行ning Internet Explorer 实例如果有一个 IE 实例 运行ning,请在每个 运行ing 使用 PID 的 IE 实例,在 1 到 2 秒后使用 TASKLIST 检查所有 IE 实例是否正常终止,如果 1 个或多个 IE 实例仍然 运行宁使用 TASKKILL/F 来杀死那些在 1 到 2 秒内没有响应并自行终止的剩余 IE 实例。