ZetCode

PowerShell Invoke-Command

最后修改:2025 年 2 月 15 日

在本文中,我们将介绍 PowerShell 中的 Invoke-Command cmdlet。此 cmdlet 在本地和远程计算机上运行命令。

Invoke-Command 基础知识

Invoke-Command cmdlet 在本地或远程计算机上运行命令。它建立临时连接以进行远程执行。结果将返回到本地计算机。这对于跨多个系统的管理任务至关重要。

Invoke-Command 基本用法

使用 Invoke-Command 最简单的方法是使用脚本块。脚本块包含要执行的命令。此示例在本地运行。输出显示当前日期和时间。

invoke1.ps1
Invoke-Command -ScriptBlock { Get-Date }

此命令在脚本块中执行 Get-Date cmdlet。结果将返回到控制台。此处不涉及远程计算机。

在远程计算机上运行命令

要在远程计算机上运行命令,请使用 -ComputerName 参数。指定一个或多个计算机名称。PowerShell Remoting 必须在目标上启用。此示例从远程服务器获取服务。

invoke2.ps1
Invoke-Command -ComputerName "Server01" -ScriptBlock { Get-Service }

此命令从 Server01 检索所有服务。远程计算机必须可访问并正确配置。结果将在本地返回。

运行多个命令

您可以在单个脚本块中执行多个命令。用分号分隔命令。此示例获取系统信息和进程。两个结果都包含在输出中。

invoke3.ps1
Invoke-Command -ScriptBlock {
    Get-CimInstance Win32_OperatingSystem;
    Get-Process | Select-Object -First 3
}

此命令获取操作系统详细信息和前三个进程。输出包含两组信息。命令按指定顺序运行。

在远程命令中使用本地变量

可以使用 -ArgumentList 将本地变量传递给远程命令。$args 数组在脚本块中访问这些值。这使得动态命令执行成为可能。该示例传递了一个进程名称。

invoke4.ps1
$processName = "explorer"
Invoke-Command -ComputerName "Server01" -ScriptBlock {
    Get-Process -Name $args[0]
} -ArgumentList $processName

此命令在 Server01 上获取 explorer 进程。$processName 变量作为参数传递。$args[0] 在脚本中访问它。

在多台计算机上运行命令

可以在 -ComputerName 中指定多台计算机。使用逗号分隔计算机名称。命令将在所有指定的系统上运行。结果包括源计算机名称。

invoke5.ps1
Invoke-Command -ComputerName "Server01","Server02" -ScriptBlock {
    Get-CimInstance Win32_ComputerSystem
}

此命令从两台服务器获取计算机系统信息。每个结果都显示了它来自哪台计算机。输出是合并的。

远程运行脚本文件

可以使用 -FilePath 远程执行现有脚本文件。脚本必须可以从本地计算机访问。这避免了输入复杂的命令。该示例在远程运行本地脚本。

invoke6.ps1
Invoke-Command -ComputerName "Server01" -FilePath "C:\scripts\check_disk.ps1"

此命令在 Server01 上运行 check_disk.ps1 脚本。脚本必须存在于指定的本地路径。此处不需要脚本块。

持久的远程会话

对于多个命令,请使用 New-PSSession 创建持久会话。使用 -Session 将会话传递给 Invoke-Command。这会维护一个连接。它比创建新连接更有效。

invoke7.ps1
$session = New-PSSession -ComputerName "Server01"
Invoke-Command -Session $session -ScriptBlock { Get-Service }
Invoke-Command -Session $session -ScriptBlock { Get-Process }
Remove-PSSession $session

这会创建一个到 Server01 的持久会话。两个命令使用相同的连接运行。完成后会删除会话。

以不同用户身份运行命令

-Credential 参数允许以其他用户身份运行命令。这需要适当的权限。凭据对象存储用户名和密码。该示例显示以管理员身份进行远程执行。

invoke8.ps1
$cred = Get-Credential
Invoke-Command -ComputerName "Server01" -ScriptBlock {
    whoami
} -Credential $cred

这会在执行前提示输入凭据。whoami 命令显示有效用户名。指定的用户必须具有远程访问权限。

来源

PowerShell 文档

在本文中,我们介绍了 PowerShell 中的 Invoke-Command cmdlet。

作者

我的名字是 Jan Bodnar,我是一位热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 PowerShell 教程