【问题标题】:Run Powershell command from different server从不同的服务器运行 Powershell 命令
【发布时间】:2020-12-15 14:52:22
【问题描述】:

我有以下 powershell 命令,它根据 .log 文件的内容读取并提供我的 .bat 脚本的状态:

Get-ChildItem *.log | ForEach-Object {
  [pscustomobject] @{
    Name = $_.Name
    Status =
      ('FAILED', 'SUCCESS')[(Select-String -Quiet 'Finished with NO errors' $_.FullName)]
  }
}

当在与存储 .log 文件的服务器 (ServerA) 相同的服务器上运行时,此命令可以完美运行,但是在它之外运行时 - 不会返回任何值。 有没有办法让它从同一网络中的另一台服务器运行?

  • 服务器:服务器A
  • 目录:c:\Temp\

【问题讨论】:

  • 一般可以使用Invoke-Command来执行远程代码。您发布的代码可以传递给 -ScriptBlock 参数,前提是您使用 {} 包围它。

标签: powershell powershell-remoting


【解决方案1】:

作为实施@AdminOfThings 建议的示例,使用一些 cmets:

$servers = "server1", "server2"
ForEach ($server in $servers){
    Invoke-Command -ComputerName $server -ScriptBlock {  
        Get-ChildItem c:\temp\*.log | ForEach-Object {
          [pscustomobject] @{
            Name = $($env:COMPUTERNAME)
            Status =  ('FAILED', 'SUCCESS')[(Select-String -Quiet 'Finished with NO errors' $_.FullName)]
          }
        }#EndOfForEachLogFile
    }#EndOf Invoke-Command
}#EndOf ForEach

【讨论】:

  • 很好,虽然 .Name 属性是日志文件名,而不是计算机名(严格来说不需要添加,因为远程处理基础结构将用.PSComputerName 属性)。另请注意,只需Name = $env:COMPUTERNAME 即可(不需要$(...))。
  • @FoxDeploy,工作就像一个魅力。你知道如何在这个输出脚本中获取 .bat 脚本的最后运行时间吗?
  • 上次运行时间必须来自脚本本身,因为 Windows 不会检查上次打开或上次执行或类似的字段。所以你可以让你的脚本更新一个文件或将时间回显到一个文件然后读取它。
  • .log 文件的日期足以满足我的需要。有没有办法在输出中包含这个?
  • 'Date = $_.LastWriteTime' - 解决问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
相关资源
最近更新 更多