我以下面的方式创建一个动态命令,这样我就可以使用本地函数和变量,并通过Invoke- ScriptBlock轻松地将它们传递给远程计算机。问题是,由于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发布于 2014-03-01 00:20:02
您可以使用以下示例将该函数传递到远程会话中。这允许您使用大括号定义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);这是你的函数的一个修改版本。请注意,可以使用-ArgumentList参数将域和用户名动态传递到远程ScriptBlock中。我使用$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';https://stackoverflow.com/questions/22100163
复制相似问题