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

时间:2017-06-28 23:16:43

标签: batch-file network-shares

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

@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

1 个答案:

答案 0 :(得分: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:并使用下一个引起的:

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 <搜索那些可执行文件/ strong>即可。在这两个环境变量的当前值上尽可能独立的批处理文件是批处理文件,也可以在错误更新的系统路径上工作,例如参见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 会更好。操作系统不应像使用选项/F那样杀死Internet Explorer。最好不使用/f使用 TASKKILL ,这会导致向IE发送关闭/退出/终止自身的事件消息,IE通常会正常处理并优雅地终止。当然,在执行下一个命令之前,应该添加大约1到2秒的延迟,以便为IE提供正常终止自身的必要时间。

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

最后可能有多个Internet Explorer实例正在运行,因此最好使用 TASKLIST 获取每个正在运行的Internet Explorer实例的进程标识符(PID)(如果有)完全运行IE实例,在每个使用PID的IE运行实例上使用 TASKKILL 而不使用/F,如果IE的所有实例都使用 TASKLIST 检查1到2秒优雅地终止并且在IE的一个或多个实例仍在运行的情况下使用 TASKKILL /F来终止那些在1到2秒内没有响应并且终止自身的剩余IE实例。