Powershell 检查进程是否在多台远程计算机上运行,并复制一个文件。如果进程未运行,请保留成功的进程列表

Powershell 检查进程是否在多台远程计算机上运行,并复制一个文件。如果进程未运行,请保留成功的进程列表,powershell,Powershell,我需要将一个文件复制到多台计算机,但只能在特定应用程序(进程)未运行时执行此操作 我知道我可以使用Invoke命令在机器列表上运行脚本(scriptblock) 但是,我如何检查进程是否在计算机上运行,然后仅复制未运行的文件 因此,在对大量计算机运行结束时,我可以很容易地看到那些成功的,例如进程未运行,文件被复制 谢谢 更新: 我假设像这样的东西可以完成我要问的第一部分,但是如何直观地显示或记录成功或失败,这样我就知道哪些计算机已经完成了-不需要太花哨,即使只是一个变量,其中包含进程未运行且文件

我需要将一个文件复制到多台计算机,但只能在特定应用程序(进程)未运行时执行此操作

我知道我可以使用Invoke命令在机器列表上运行脚本(scriptblock)

但是,我如何检查进程是否在计算机上运行,然后仅复制未运行的文件

因此,在对大量计算机运行结束时,我可以很容易地看到那些成功的,例如进程未运行,文件被复制

谢谢

更新:

我假设像这样的东西可以完成我要问的第一部分,但是如何直观地显示或记录成功或失败,这样我就知道哪些计算机已经完成了-不需要太花哨,即使只是一个变量,其中包含进程未运行且文件已被复制的计算机名也可以

Invoke-Command -ComputerName PC1, PC2, PC3 -ScriptBlock {

If ((Get-process -Name notepad -ea SilentlyContinue) -eq $Null){

   Copy-Item -Path "\\server01\c$\test\file.txt" -Destination "C:\test\file.txt" -Force

}

}
编辑:

$computers = @("PC1","PC2","PC3")
    Foreach($computer in $computers){
$Procs = invoke-command -ComputerName $computer { Get-Process Notepad -ErrorAction SilentlyContinue}
    If(!$Procs){"$Computer - not running Notepad"; Copy-Item -Path "\\server01\c$\test\file.txt" -Destination "\\$computer\c$\test\" -Force}
    elseif($Procs){"$Computer - is running Notepad"}
    }
Edit2(用于清洁输出):

编辑:

$computers = @("PC1","PC2","PC3")
    Foreach($computer in $computers){
$Procs = invoke-command -ComputerName $computer { Get-Process Notepad -ErrorAction SilentlyContinue}
    If(!$Procs){"$Computer - not running Notepad"; Copy-Item -Path "\\server01\c$\test\file.txt" -Destination "\\$computer\c$\test\" -Force}
    elseif($Procs){"$Computer - is running Notepad"}
    }
Edit2(用于清洁输出):


我想这就是你想要的,或者至少是接近的:

$Results = @()

$Results += 
  Invoke-Command -ComputerName DellXPS137000, DellXPS8920 -ScriptBlock {

    $GPArgs = @{Name        = "Notepad++"
                ErrorAction = "SilentlyContinue"}
    If ( $Null -ne (get-process @GPArgs )) {
      #Process your copy here
      $Status = "Success"
    }
    Else {$Status = "Failed"}
  
    $Machine = 
      (Get-CimInstance -ClassName 'Win32_OperatingSystem').CSName
    Return ,"$Machine : $Status"

  }
美元的价值结果:

PS> $results
DELLXPS137000 : Success
DELLXPS8920 : Failed

HTH

我想这就是你想要的,或者至少是接近的:

$Results = @()

$Results += 
  Invoke-Command -ComputerName DellXPS137000, DellXPS8920 -ScriptBlock {

    $GPArgs = @{Name        = "Notepad++"
                ErrorAction = "SilentlyContinue"}
    If ( $Null -ne (get-process @GPArgs )) {
      #Process your copy here
      $Status = "Success"
    }
    Else {$Status = "Failed"}
  
    $Machine = 
      (Get-CimInstance -ClassName 'Win32_OperatingSystem').CSName
    Return ,"$Machine : $Status"

  }
美元的价值结果:

PS> $results
DELLXPS137000 : Success
DELLXPS8920 : Failed

HTH

谢谢您的回复,看起来正是我需要的。但是,如果文件复制部分-复制项-路径“\\server\file.txt”-目的地“C:\folder\file.txt”-Force-出现问题,则无法将
复制项
行更改为:
复制项-路径“\\server01\C$\test\file.txt”-目的地“\\$PC1\C$\test\”-Force
。只是语法不正确。使用
Get Help Copy Item
查看应该如何完成。您基本上是在告诉它复制您机器上的现有文件。@AbrahamZinala-是的,您使用c$的路径工作正常,但我对RetiredGeek进行了响应,并且使用他的方法,$计算机没有变量-因此为什么要用c:\谢谢您的响应,看起来正是我需要的。但是,如果文件复制部分-复制项-路径“\\server\file.txt”-目的地“C:\folder\file.txt”-Force-出现问题,则无法将
复制项
行更改为:
复制项-路径“\\server01\C$\test\file.txt”-目的地“\\$PC1\C$\test\”-Force
。只是语法不正确。使用
Get Help Copy Item
查看应该如何完成。您基本上是在告诉它复制您机器上的现有文件。@AbrahamZinala-是的,您使用c$的路径工作正常,但我对RetiredGeek做出了响应,并且使用他的方法,$computer没有可使用的变量-因此为什么要用c:\现在怎么样?请参阅edit.Perfect-谢谢:)您可以尝试添加一个
测试连接来过滤离线的连接。您现在运行了吗?如果它再次返回一个,你能发布错误吗?对不起,忘记展开字符串了,现在呢?请参阅edit.Perfect-谢谢:)您可以尝试添加一个
测试连接来过滤离线的连接。您现在运行了吗?如果它再次返回一个,你能发布错误吗?对不起,忘记扩展字符串了