在服务器B上执行的bat脚本无法连接到服务器A复制文件

Posted

技术标签:

【中文标题】在服务器B上执行的bat脚本无法连接到服务器A复制文件【英文标题】:bat script executed on server B cannot connect to server A to copy files 【发布时间】:2016-08-05 13:30:38 【问题描述】:

我有一个使用两台服务器运行(A 和 B)的网站。它显示从 MSSQL 中提取的报告。服务器都是 Windows 2012 R2。我创建了一个 .bat 文件,用于将网站文件从一台服务器(B)复制到另一台服务器(A),以便我可以将它们一起更新。我只在服务器 B 上手动更新网站的文件。

我可以在我的计算机上或直接在任一服务器上正常运行 .bat 文件,它工作正常,所有文件都从 B 复制到 A。这是 .bat 文件:

rem echo off

SET source="D:\WebContent\engsys.corp.ftr.com"
SET source2="\\MAFINFWWWPV02\D$\WebContent\engsys.corp.ftr.com"
SET dest1="\\MAFINFWWWPV01\engsys.corp.ftr.com"

xcopy %source% %dest1% /E /Y

rem xcopy %source2% %dest1% /E /Y

echo #%username%@%computername%

我正在使用变量,以便我可以快速切换它们进行测试。

我在其中一个网页上创建了一个按钮,这样我只需单击该按钮,它就会运行 .bat 文件。但是,当我使用按钮运行它时,它不会复制文件。在网站上,当我单击按钮时,它被称为:system('cmd /c ' . $script); 然后在网页上显示

无效的驱动器规范 0 个文件已复制

如果我将目标更改为C:\Temp,那么它运行良好并将文件复制到运行脚本的服务器上的文件夹中。如果我将其更改为Z:\,那么我会得到与运行原始版本相同的错误。 Z:\ 是我放在 B 上的另一台服务器(A)的映射驱动器。

我知道服务器可以相互通信,因为我已将驱动器从一台服务器映射到另一台服务器以用于存储网站文件的位置,以便每台服务器都有一个映射到其他服务器网站文件的驱动器(@ 987654326@)。我原以为我可以用这个作为目的地。不过,这只是给出了同样的错误,即不是有效的驱动器。

由于我不是唯一将使用该网站的管理员,因此我确实需要此按钮才能工作。我们中有 2 个人可能会更新文件,但我们有一个团队可能需要我们管理页面来更新某些内容,然后需要使用按钮来确保将它们复制到两个服务器。

编辑

我注释掉了echo off 这是运行.bat 文件的结果。我确实对其进行了格式化,使其不仅仅是一个长字符串。

>rem echo off 
>SET source="D:\WebContent\engsys.corp.ftr.com" 
>SET source2="\\MAFINFWWWPV02\D$\WebContent\engsys.corp.ftr.com" 
>SET dest1="\\MAFINFWWWPV01\engsys.corp.ftr.com" 
>xcopy "D:\WebContent\engsys.corp.ftr.com" "\\MAFINFWWWPV01\engsys.corp.ftr.com" /E /Y Invalid drive specification 0 File(s) copied 
>rem xcopy "\\MAFINFWWWPV02\D$\WebContent\engsys.corp.ftr.com" "\\MAFINFWWWPV01\engsys.corp.ftr.com" /E /Y 
>rem pause 
>echo #MAFINFWWWPV02$@MAFINFWWWPV02 #MAFINFWWWPV02$@MAFINFWWWPV02 

不使用网站从服务器运行时的用户名计算机名称:

#mmm976@MAFINFWWWPV02

【问题讨论】:

【参考方案1】:

这是最终奏效的方法:

这是在 php 文件中:

case 'CopyFiles':
$script = chr(92) . chr(92) . 'MAFINFWWWPV02\D$\WebContent\engsys.corp.ftr.com\BatchFiles\CopyFiles.bat';
system('cmd /c ' . $script); echo " <br>";
GetCommand(!NULL);
break;

这是 .bat 文件:

echo off

SET source2="\\MAFINFWWWPV02\engsys.corp.ftr.com"

START /wait NET USE L: "\\MAFINFWWWPV01\engsys.corp.ftr.com" Password /user:corp\mmm976

xcopy %source2% L: /E /Y /Q

NET USE L: /DELETE

在将 bat 文件映射到共享驱动器后,我可以使用它来复制文件。我真的不知道为什么当我之前映射了位置但它不起作用时这会起作用,但现在可以了。

【讨论】:

我试过了,UNC 路径,允许服务桌面访问,以管理员身份服务,没有任何效果。使用“net use”在批处理文件中创建驱动器完美无缺。谢谢 @ChrisAdmin 很高兴它有帮助,在我找到那一点点之前,这是开始工作的一大痛苦。【参考方案2】:

Z 必须指向 UNC 路径。

您不应该依赖驱动器,而是使用 UNC 路径,除非您需要 cd 到此处不是这种情况的位置。 UNC 路径有更好的机会被所有机器看到。根据会话,驱动器可能已安装,也可能未安装。

输入net use | find "Z"

您会看到 Z 的安装位置,例如:\\foo\bar

在您的脚本中将 Z:\ 替换为 \\foo\bar\

在您的情况下(在 MAFINFWWWPV02 上运行):

xcopy D:\WebContent\engsys.corp.ftr.com "\\MAFINFWWWPV01\engsys.corp.ftr.com" /E /Y

(您也因为来源而获得了无效的驱动器)

【讨论】:

我试过了。我替换了Z:` with the results from net 使用 |找到我在映射的服务器上运行的“Z”。我仍然得到Invalid drive specification 0 File(s) copied。它变成了\\ServerName\ShareName \\MAFINFWWWPV01\engsys.corp.ftr.com 是结果。 如果没有驱动器,它不能发出invalid drive。你能设置echo on 并发布你的脚本输出吗? 添加了上面的结果。 来源仍然提到驱动器。您正在运行脚本的机器的主机名是什么?

以上是关于在服务器B上执行的bat脚本无法连接到服务器A复制文件的主要内容,如果未能解决你的问题,请参考以下文章

PHPMailer:SMTP错误:10051无法连接到服务器:尝试对无法访问的网络执行套接字操作

通过shell脚本对其他服务器上的数据库执行oracle查询

在 Qlik 复制中连接到 Oracle Endpoint 时出错“无法加载 libclntsh.so.11.1”

AWS ELB - 服务 A 无法连接到同一安全组中的服务 B

Tableau怎么连接到数据?

Linux无法远程连接Redis?