【问题标题】:Starting a process remotely in Powershell, getting %ERRORLEVEL% in Windows在 Powershell 中远程启动进程,在 Windows 中获取 %ERRORLEVEL%
【发布时间】:2011-03-14 14:10:18
【问题描述】:

一点背景:

我正在尝试在测试开始时远程启动和停止一些性能计数器,然后在测试结束时停止它们。我是从 Win2003 机器的自动化测试框架执行此操作,测试框架执行命令而不启动控制台,一些被测系统正在运行 Win2008。我编写了脚本来根据分配给服务器的角色选择性能计数器。

我的问题:

  1. logman 无法在运行更高版本操作系统的机器上启动或停止计数器。
  2. psexec 可用于远程运行 logman,但 psexec 在从测试框架运行时喜欢间歇性挂起。它可以从命令行手动运行。我猜这是因为调用进程没有提供控制台,或者类似的尴尬。对此我无能为力 (GRRRR)
  3. 我编写了一个 PowerShell 脚本,它使用 WMI 的 win32_process 远程执行 logman 并从批处理脚本中调用它,这工作正常。但是,测试框架根据%ERRORLEVEL% 和stderr 的内容来决定通过和失败的场景,但是WMI 的win32_process 不给我任何访问权限。因此,如果计数器无法启动,无论如何都会继续进行测试,浪费大家的时间。

我正在寻找一种解决方案,它允许我在远程机器上执行程序、检查程序的返回代码和/或通过管道将 stderr 返回给调用者。为简单起见,它需要用普通 Win2k3 盒子上可用的工具编写。我真的不希望使用复杂的脚本集合,将内容转储到日志文件中,然后再次将它们读回。

有没有人遇到过类似的问题,并解决了,或者至少有一个建议?

【问题讨论】:

    标签: powershell wmi win32-process


    【解决方案1】:

    为了简单起见,它需要 用可用的工具编写 在香草 Win2k3 盒子上。我真的会 不喜欢使用复杂的 转储东西的脚本集合 进入日志文件,然后将它们读回 又出来了。

    PowerShell 不是 Windows 2003 中的本机工具。您是否仍要将此问题标记为 PowerShell 并寻找答案?无论如何,我会给你一个PowerShell的答案。

    $proc = Invoke-WmiMethod -ComputerName Test -Class Win32_Process -Name Create -ArgumentList "Notepad.exe"
    Register-WmiEvent -ComputerName test -Query "Select * from Win32_ProcessStopTrace Where ProcessID=$($proc.ProcessId)" -Action { Write-Host "Process ExitCode: $($event.SourceEventArgs.NewEvent.ExitStatus)" }
    

    这需要在运行这些脚本的系统上安装 PowerShell 2.0。您的 Windows 2003 远程系统实际上并不需要 PowerShell。

    PS:如果您需要 WMI 和 PowerShell 速成课程,请阅读我的电子指南:WMI Query Language via PowerShell

    【讨论】:

    • 太好了,谢谢!我会调查Register-WmiEventWin32_ProcessStopTrace,看起来正是我需要的:)
    • 哦,我已经离开 Windows 很长一段时间了,我没有意识到 powershell 默认不在 Win2k3 上。但它在我们的环境中,所以我正在使用它。
    • 几乎每次看到你回答,我都会学到一些关于 WMI 的新知识 :) +1
    • @stej,谢谢!很高兴我的回答很有帮助。你在所有其他问题上都击败了我。我需要一个更快的 RSS 阅读器 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    相关资源
    最近更新 更多