我正在创建一个动态ScriptBlock,因此我可以使用本地函数和变量,并通过Invoke-Command轻松将它们传递给远程计算机。问题是因为Create中的所有文本都用双引号括起来,所以我的所有语法都突出显示,因为所有编辑都将代码视为一个大字符串。
虽然这只是一个整容问题,但我想找到一个可以让我的代码在没有双引号的情况下传递的解决方法。我已经尝试在Create中传递变量而不是实际文本,但它没有被解释。
function local_admin($a, $b) {
([adsi]"WinNT://localhost/Administrators,group").Add("WinNT://$a/$b,user")
}
$SB = [ScriptBlock]::Create(@"
#Define Function
function local_admin {$Function:local_admin}
local_admin domain username
"@)
Invoke-Command -ComputerName server2 -ScriptBlock $SB
答案 0 :(得分:0)
您可以使用以下示例将该功能传递到远程会话中。这允许您使用花括号而不是字符串来定义ScriptBlock
。
# Define the function
function foo {
"bar";
}
$sb = {
# Import the function definition into the remote session
[void](New-Item -Path $args[0].PSPath -Value $args[0].Definition);
# Call the function
foo;
};
#(gi function:foo) | select *
Invoke-Command -ComputerName . -ScriptBlock $sb -ArgumentList (Get-Item -Path function:foo);
以下是您的功能的修改版本。请注意,可以使用ScriptBlock
参数将域和用户名动态传递到远程-ArgumentList
。我正在使用$args
自动变量将对象传递到ScriptBlock
。
function local_admin($a, $b) {
([adsi]"WinNT://localhost/Administrators,group").Add("WinNT://$a/$b,user")
}
$SB = {
#Define Function
[void](New-Item -Path $args[0].PSPath -Value $args[0].Definition);
# Call the function
local_admin $args[1] $args[2];
}
Invoke-Command -ComputerName server2 -ScriptBlock $SB -ArgumentList (Get-Item -Path function:local_admin), 'domain', 'username';