2

我正在尝试从列表中的许多服务器调用 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

4

1 回答 1

1

问题似乎是您实际上并没有x.cmd在远程服务器上调用,因为该变量没有在wmic调用中替换。将定义remoteCmd移出循环并用百分号括remoteCmdwmic调用中:

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 上收到了一个processIDand的响应Error level=0,因此可以说这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您可以在命令行上查看那些。

于 2013-05-23T09:29:14.450 回答