【问题标题】:dos batch script using psexec shows 'help' text every time it loops使用 psexec 的 dos 批处理脚本每次循环时都会显示“帮助”文本
【发布时间】:2023-04-10 06:43:01
【问题描述】:

目前正在编写一个脚本来 ping /24 子网上的每个主机,然后执行另一个脚本,该脚本在那些在线的机器上运行 psexec。 ping 扫描脚本称为 ping.bat,而在机器上实际运行 psexec 的另一个脚本称为 deploy_mir.bat。我可以简单地在远程主机上运行 deploy_mir.bat,它运行起来没有问题。

我遇到的问题是每次 mir.bat 运行时,它本身包含一个循环,它会在 cmd 窗口中显示 psexec 的帮助信息。据我所知,一切正常,除了每次运行 mir.bat 内部的循环时,我的 cmd 窗口都会充满 psexec 的帮助信息。我没有启用@echo,并不是说它会导致这种情况。

希望快速修复,但如果需要我的代码来获得答案,请发布它。

仍然发布代码...

@echo on

setlocal EnableDelayedExpansion

set /p ipAddress="enter ip address: "

for /l %%i in (1,1,255) do (
ping -n 1 %ipAddress%.%%i | find "TTL" > nul

if !errorlevel! == 0 (
call deploy_mir.bat %ipAddress%.%%i
)
)

endlocal

deploy_mir.bat 代码

@ECHO OFF

echo "Mir Agent deployment to: %1"


rem net use T: \\%1\C$ /user:administrator "password"
net use T: \\%1\C$ /user:administrator "username"

copy /y conf.xml T:\WINDOWS\
copy /y setup_mir.bat T:\WINDOWS\
net use t: /delete

rem psexec \\%1 -i -u administrator -p "password" c:\windows\setup_mir.bat
psexec \\%1 -i -u administrator -p "username" c:\windows\setup_mir.bat

运行 deploy_mir.bat 所需的命令行结果

C:\DOCUME~1\socuser2\MIR>deploy_mir.bat 10.180.145.66
"Mir Agent deployment to: 10.180.145.66"
The command completed successfully.

        1 file(s) copied.
        1 file(s) copied.
        1 file(s) copied.
t: was deleted successfully.


PsExec v1.94 - Execute processes remotely
Copyright (C) 2001-2008 Mark Russinovich
Sysinternals - www.sysinternals.com


c:\windows\setup_mir.bat exited on 10.180.145.66 with error code 0.

C:\DOCUME~1\socuser2\MIR>

【问题讨论】:

  • 冒着听起来很明显的风险,我会再看看你的代码。您可能知道,帮助信息通常仅在您的语法有问题或您使用 /? 询问时才会出现。或者其他的东西。您的代码在 ping 批处理中是什么样的?
  • deploy_mir.bat 是唯一使用 psexec 的脚本,它是由其他人创建的,运行没有问题。我的脚本 mir.bat 只调用 deploy_mir.bat。
  • 另外,我将 mir.bat 中的代码添加到我的问题中
  • 当我回答 your previous question 时,我使用了一个 deploy_mir.bat,它有一条信号线:@echo %*。无论谁编写了 deploy_mir.bat,请向我们展示代码。向我们展示一个产生您正在寻找的输出的命令行。如果可以修改,在psexec前面加一个echo,看看使用的命令行。有了这个,修复只需几秒钟。
  • 我在原始问题中发布了 deploy_mir.bat 的代码

标签: batch-file dos psexec


【解决方案1】:

只是一个建议。不确定它是否能解决您的问题,但可能会提供一些指导:

我的第一步是一个小测试,通过在某个测试批处理文件上显式调用 psexec 来代替 call deploy_mir.bat %ipAddress%.%%i 行。如果没有出现帮助消息,因为 deploy_mir.bat 可以自行查找,请尝试将其内容显式放置在同一行调用 deploy_mir.bat %ipAddress%.%%i 的位置。如果可行,那么我们一直在替换的上述行中存在一些问题。我相信 dos / batch 将从这行代码中打开一个子 shell 并在该范围内运行它的代码。这可能是导致问题的原因。只是根据提供的信息猜测。

代码具体说明:

@echo 已启用,但您说它不在您的问题中。 !错误级别! == 0 应该是 !errorlevel! EQU 0

一些一般说明:

一般来说,我过去常常用引号将参数传递给批处理脚本,然后在批处理脚本中用%~1 去掉引号。对于 if 条件类似,如 !someVar! == a 如果 someVar 未设置/为空,则会抛出错误,而 "!someVar!" == "a" 不会满足 if 条件的条件。

【讨论】:

  • 我很确定问题出在我调用 deploy_mir.bat 的那段代码中。毕竟,我可以自己运行 deploy_mir.bat,却永远得不到帮助信息。
  • 您进行了哪些测试以缩小问题范围?
  • 好吧,我知道问题不在于 deploy_mir.bat,我可以自行运行该脚本而不会出现问题。
【解决方案2】:

我不知道为什么从循环外调用它会起作用。但是 deploy_mir.bat 中的psexec 行应该有cmd /c

psexec \\%1 -i -u administrator -p "username" cmd /c c:\windows\setup_mir.bat

【讨论】:

  • 我认为没有必要,就像我一直在说“deploy_mir.bat”完全没有问题。
  • 要知道一个想法不好而不是尝试它需要更多的输入......我建议你环顾四周,感受一下 * 的工作原理
  • 当我说 deploy_mir.bat 不是整个事情的问题时,你明白我在说什么吗?问题出在 mir.bat 的某个地方,我可以自己运行 deploy_mir.bat 并且它可以工作。当我尝试从 mir.bat 内部执行 deploy_mir.bat 时,那就是我们遇到问题的时候。逻辑会推断问题出在 mir.bat
  • 我只是尽我所能,免费为您提供我们所拥有的信息。我不是故意浪费你的时间。 This method 读起来很长,但它经常在 SO 上被引用为有帮助。我已经完成了,但是在 psexec 之前添加一个回显并发布失败的启动结果将帮助您找到两次运行之间的差异。
最近更新 更多