[英]Batch script, call cmd on servers
我试图从列表中的许多服务器调用x.cmd,基本上x.cmd将返回一个日志文件,因此我会将输出日志文件复制到一个新文件夹中。 该列表中的结构为:服务器名称和我将创建的服务器上的x.cmd的文件夹路径以及输出文件夹名称
当我运行下面的脚本时,它不返回任何错误并且返回值为0。但是当我在实际服务器上进行检查时,x.cmd只是不执行任何操作。 一旦我手动运行x.cmd,它就可以正常工作。
请尽可能指出我脚本的错误。 我的另一个担心是文件夹路径太长(但是如果我正确的话,它在Microsoft的限制之内)。 :) 谢谢你的时间。
@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
在远程服务器上调用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:由于您在shell上获得了带有processID
和Error level=0
的响应,可以肯定地说x.cmd
实际上是在远程服务器上启动的。 日志文件没有出现在x.cmd
所在的目录中的x.cmd
,很可能是因为在x.cmd
没有为日志文件提供绝对路径。 这意味着它将在执行x.cmd
的cmd.exe
所在的远程计算机上的目录中创建。 在大多数系统中,这将是%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
查看这些内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.