9

运行以下命令时遇到问题

$x =  "c:\Scripts\Log3.ps1"
$remoteMachineName = "172.16.61.51"
Invoke-Command -ComputerName $remoteMachineName  -ScriptBlock {& $x}

The expression after '&' in a pipeline element produced an invalid object. It must result in a command name, script
block or CommandInfo object.
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : BadExpression
    + PSComputerName        : 172.16.61.51

如果我不使用$x变量,则看不到问题

Invoke-Command -ComputerName $remoteMachineName  -ScriptBlock {& 'c:\scripts\log3.ps1'}

    Directory: C:\scripts


Mode                LastWriteTime     Length Name                                  PSComputerName
----                -------------     ------ ----                                  --------------
-a---         7/25/2013   9:45 PM          0 new_file2.txt                         172.16.61.51
4

2 回答 2

11

PowerShell 会话中的变量不会转移到使用创建的会话中Invoke-Command

您需要使用-ArgumentList参数将变量发送到您的命令,然后使用$args数组在脚本块中访问它们,因此您的命令将如下所示:

Invoke-Command -ComputerName $remoteMachineName  -ScriptBlock {& $args[0]} -ArgumentList $x
于 2013-07-26T12:59:49.623 回答
4

如果您在脚本块中使用变量,则需要添加修饰符using:。否则 Powershell 将在脚本块内搜索 var 定义。

您也可以将其与喷溅技术一起使用。例如:@using:params

像这样:

# C:\Temp\Nested.ps1
[CmdletBinding()]
Param(
 [Parameter(Mandatory=$true)]
 [String]$Msg
)

Write-Host ("Nested Message: {0}" -f $Msg)

# C:\Temp\Controller.ps1
$ScriptPath = "C:\Temp\Nested.ps1"
$params = @{
    Msg = "Foobar"
}
$JobContent= {
    & $using:ScriptPath @using:params
}
Invoke-Command -ScriptBlock $JobContent -ComputerName 'localhost'
于 2016-12-23T10:28:32.443 回答