如何在作为字符串的远程会话中执行PowerShell块,而不是ScriptBlock?

时间:2012-12-04 09:07:40

标签: powershell powershell-remoting powershell-v3.0

我正在尝试在远程PowerShell会话中自定义提示。一切正常:

$session = New-PSSession MyRemoteServer
Invoke-Command -Session $session -ScriptBlock {
    New-PSDrive -Name MyApp -PSProvider FileSystem -Root D:\Applications\MyApp | Out-Null
    CD MyApp:\
    function prompt { "test" }
}
Enter-PSSession -Session $session

它创建一个会话,为方便起见设置了一个PSDrive,然后将提示自定义为“Test”。

但是,我不希望我的提示说“测试”,我想执行一些code that colours the server name。但是,我不想在脚本块(上面)中对其进行硬编码,因为我想在许多类似的函数中重用它来连接到不同类型的服务器。

所以我已经在本地定义了这个函数,并且可以使用“Get-Content function:\ RemotePrompt”获取内容。但是,我正在努力弄清楚如何将其发送到另一个会话。 Invoke-Expression似乎不会占用Session,而Invoke-Command似乎总是期望一个脚本块。

我真正想做的事情就像Invoke-Command -ScriptBlock { function prompt $MyRemoteCode },但变量被“解析”了。

这可能/容易吗?

2 个答案:

答案 0 :(得分:3)

Powershell V3变量前缀为$ using:会自动识别为局部变量并发送到远程计算机 所以你可以使用
PS>$test="local var"
PS>icm -cn server1 -ScriptBlock{write-host $using:test}
local var

您可以在此处查看V3的所有新功能:http://blogs.msdn.com/b/powershell/archive/2012/06/14/new-v3-language-features.aspx

答案 1 :(得分:2)

您可以使用scriptblock .net class:

[scriptblock]::Create( $s)

其中$ s是string类型。