Powershell 调用脚本块 - 通过进程检查而不仅仅是文本

Powershell Invoke script block - pass proccess check not just text

我怎样才能得到:(有效)

$Procname = 'notepad'

Invoke-Command -ComputerName sandbox -ScriptBlock {

    if ((Get-Process | Where-Object {$_.Name -eq $Procname}) -eq $null) {
        Write-Host 'null' -ForegroundColor Red
    } else {
        Write-Host running -ForegroundColor Green
    }
}

也太像了吧? (没有工作)

$Procname = 'notepad'
$chk = (Get-Process | Where-Object {$_.Name -eq $Procname})

Invoke-Command -ComputerName sandbox -ScriptBlock {

    if ($chk -eq $null) {
        Write-Host 'null' -ForegroundColor Red
    } else {
        Write-Host running -ForegroundColor Green
    }
}

我遇到的问题是获取进程 |从脚本块外部到 运行 的对象,我可以从脚本块外部(即 $Procname)传递文本 OK 但我正在尝试传递命令,我需要做什么特殊的事情?

我问过叔叔google,但我觉得我问错了

我也尝试将 $chk 作为参数和参数,但它们对我不起作用

好的,看来您想知道如何通过 Invoke-Command 在远程执行中引用局部变量。完全可以用 $using: 上下文做的事情。例如,要让您的脚本查看记事本是否在您的计算机上 运行,然后在远程系统上引用这些结果,您可以这样做:

$Procname = 'notepad'
$chk = (Get-Process | Where-Object {$_.Name -eq $Procname})

Invoke-Command -ComputerName sandbox -ScriptBlock {

    if ($using:chk -eq $null) {
        Write-Host 'null' -ForegroundColor Red
    } else {
        Write-Host 'running' -ForegroundColor Green
    }
}

同样,如果您想查看记事本是否在远程服务器上 运行,您可以这样做:

$Procname = 'notepad'

Invoke-Command -ComputerName sandbox -ScriptBlock {

    if ((Get-Process | Where-Object {$_.Name -eq $using:Procname}) -eq $null) {
        Write-Host 'null' -ForegroundColor Red
    } else {
        Write-Host 'running' -ForegroundColor Green
    }
}

但我个人认为这很难阅读,我会倒过来做:

$Procname = 'notepad'

Invoke-Command -ComputerName sandbox -ScriptBlock {

    if (Get-Process | Where-Object {$_.Name -eq $using:Procname}) {
        Write-Host 'running' -ForegroundColor Green
    } else {
        Write-Host 'null' -ForegroundColor Red
    }
}

或者不直接在远程服务器上 运行 任何东西:

$Procname = 'notepad'
$chk = Get-Process -Computer sandbox | ?{$_.Name -eq $Procname}
If($chk){
    Write-Host 'Running' -ForegroundColor Green
}else{
    Write-Host 'Null' -ForegroundColor Red
}