【发布时间】:2021-07-28 17:08:30
【问题描述】:
我正在尝试从远程系统获取主机名、日期和时间,但在执行服务器端批处理文件时没有得到想要的结果
参考: 远程端批处理文件
@echo off
hostname.exe > __t.tmp
set /p host=<__t.tmp
del __t.tmp
set hst=%host%
set dt=%Date%
Set tm = %Time%
set RETURNVALUE= %host%, %Date%, %Time%
ENDLOCAL&SET %~1=%RETURNVALUE%
如果我回显“ReturnValue”,这一切都很好
和服务器端批处理文件(iplist.txt是包含远程机器IP的文件)
@echo off
for /f "tokens=*" %%a in ('type iplist.txt') do (
set line=%%a
echo %line%
wmic /node:%line% process call create "cmd.exe D:\\Scripts\\RCMD_TS.bat RtVal"
echo %RtVal%
)
set %%a=
set %a=
set line=
set rt=
这将返回以下内容:
D:\Scripts>ServerSideExecuteRemoteCommand.bat
ECHO is off.
call - Alias not found.
ECHO is off.
ECHO is off.
call - Alias not found.
ECHO is off.
ECHO is off.
call - Alias not found.
ECHO is off.
ECHO is off.
call - Alias not found.
ECHO is off.
我在这里做错了什么?我也可以得到 3 个值(单独的主机名、日期和时间)而不是 1 个(返回值)我试过但它没有发生。
【问题讨论】:
-
为什么要使用
for循环来解析计算机名称文本文件的每一行,然后将它们传递给WMIC.exe?只需将wmic /node:%line%更改为wmic /node:@iplist.txt,WMIC.exe 将直接使用该文件中列出的每一台计算机!另外,您确定每台计算机都可以访问批处理文件D:\Scripts\RCMD_TS.bat? -
嗯.. 没想到... 不错。将检查并恢复。谢谢。是的,客户端 PC 可以访问批处理文件,因为它仅驻留在客户端。服务器端只是调用它。
-
我更改了批处理文件。 iplist.txt 有 2 个 ip:127.0.0.1 和 192.168.212.21。结果是这样的: Node - 127.0.0.1 Executing (Win32_Process)->Create() 方法执行成功。输出参数:__PARAMETERS { ProcessId = 11076 的实例;返回值 = 0; };节点 - 192.168.212.21 错误:描述 = RPC 服务器不可用。批处理文件更改为:del /F D:\Scripts\HDT.txt wmic /node:@iplist.txt process call create "cmd.exe D:\\Scripts\\RCMD_TS.bat RtVal" echo %RtVal%>>D :\Scripts\HDT.txt set RtVal= HDT.txt 仅显示“Echo is Off”
-
在您的服务器端批处理文件中,变量
line和RtVal在同一个代码块中分配和读取,即for循环,它需要delayed expansion。而循环后的set %%a=和set %a=是没用的,因为你无法清除for元变量,这些不是你可以设置的正常环境变量;但无论如何,在脚本顶部使用setlocal并在底部使用endlocal可确保最终消除环境更改……
标签: windows batch-file cmd return-value remote-access