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

时间:2013-05-23 08:02:41

标签: windows batch-file

我试图从列表中的许多服务器调用x.cmd,基本上x.cmd将返回一个日志文件,因此我将输出日志文件复制到一个新文件夹中。 该列表中的结构是: 服务器名称和服务器上的x.cmd的文件夹路径以及我将创建的输出文件夹名称

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

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

@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

1 个答案:

答案 0 :(得分:1)

问题似乎是您实际上并未在远程服务器上调用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的那些。