我试图从列表中的许多服务器调用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
答案 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:由于您在使用processID
和Error 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
的那些。