批处理脚本,在服务器上调用cmd

我想从列表中的许多服务器调用x.cmd,基本上x.cmd将返回一个日志文件,所以我将复制输出日志文件到一个新的文件夹。 该列表中的结构是:服务器名称和文件夹path,服务器上的x.cmd和输出文件夹名称,我将创build

当我运行下面的脚本,它不会返回任何错误,返回值是0.但是,当我检查实际的服务器时,x.cmd只是没有做任何事情。 一旦手动运行,x.cmd正常工作。

请尽可能指出我脚本的错误。 我的另一个担心是文件夹path太长(但如果我是正确的,它在微软的范围内)。 :) 谢谢你的时间。

@echo on cd /d %~dp0 setlocal EnableDelayedExpansion set serverList=List.txt for /f "usebackq tokens=1,2,3* delims=&" %%A in ("%serverList%") DO ( set remoteCmd=x.cmd wmic /node:%%A process call create "%%B\remoteCmd" pause robocopy %%B\logs Output\%%C /e ) endlocal Pause 

JS

问题似乎是你没有在远程服务器上调用x.cmd ,因为这个变量在wmic调用中没有被替换。 将remoteCmd的定义移出循环,并以百分号将remoteCmd放在wmic调用中:

 set serverList=List.txt set remoteCmd=x.cmd for /f "usebackq tokens=1,2,3* delims=&" %%A in ("%serverList%") DO ( wmic /node:%%A process call create "%%B\%remoteCmd%" pause robocopy %%B\logs Output\%%C /e ) 

更新1:因为你得到了一个processIDError level=0的shell的响应,所以说x.cmd实际上是在远程服务器上启动是相当安全的。 日志文件不在x.cmd所在的同一目录中,这很可能是因为日志文件在x.cmd没有给出绝对路径。 这意味着它将在cmd.exe所在的远程机器的目录中创建,该目录正在执行x.cmd 。 在大多数系统中,这将是%WINDIR%\system32 ,即c:\windows\system32

更新2:如果修改x.cmd是没有选项的,那么在调用它之前,你需要改变目录的路径。 你可以这样做:

 wmic /node:%%A process call create "cmd /c cd /d %%B & x.cmd" 

注意: cd /d允许您跨不同的驱动器更改目录。

更新3:由于目录名称中有空格,所以需要用引号括起来,因为已经有外部引号包含了整个远程命令。 这意味着:

 wmic /node:%%A process call create "cmd /c \"cd /d %%B\" & x.cmd" 

注意:内部引号的一个可能的替代方法是使用相关目录的8.3文件名。 您可以在命令行上使用dir /x查看这些文件。