首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PowerShell ScriptBlock和多功能

PowerShell ScriptBlock和多功能
EN

Stack Overflow用户
提问于 2012-10-27 22:15:09
回答 3查看 11.3K关注 0票数 2

我写了以下代码:

代码语言:javascript
复制
cls
function GetFoo() { 
    function GetBar() {
        $bar = "bar"
        $bar
    }

    $foo = "foo"
    $bar = GetBar
    $foo
    $bar
}


$cred = Get-Credential "firmwide\srabhi_adm"
$result = Invoke-Command -Credential $cred -ComputerName localhost 
-ScriptBlock ${function:GetFoo}
Write-Host $result[0]
Write-Host $result[1]

它可以工作,但我不想在GetFoo中定义GetBar

我能做这样的事情吗?

代码语言:javascript
复制
cls
function GetBar() {
    $bar = "bar"
    $bar
}

function GetFoo() {     
    $foo = "foo"
    $bar = GetBar
    $foo
    $bar
}


$cred = Get-Credential "firmwide\srabhi_adm"
$result = Invoke-Command -Credential $cred -ComputerName localhost 
-ScriptBlock ${function:GetFoo; function:GetBar; call GetFoo}
Write-Host $result[0]
Write-Host $result[1]

基本上,我是有选择地把我想要的函数放在ScriptBlock中,然后调用其中的一个。这样,我就不必在function内部定义函数,并且可以通过注入我想要成为该ScriptBlock一部分的函数来构造ScriptBlock。

EN

回答 3

Stack Overflow用户

发布于 2012-10-29 17:00:23

问题是Invoke-Command只能看到ScriptBlock内部的内容,而不能看到外部定义的函数。如果你真的想-你可以在一行中运行所有的东西,就像这样:

代码语言:javascript
复制
$result = Invoke-Command  -ComputerName localhost  -ScriptBlock { function GetBar() { $bar = "bar"; $bar }; function GetFoo() { $foo = "foo"; $bar = GetBar; $foo;  $bar }; GetFoo }

但我个人建议您将函数保存在脚本中,并使用-FilePath参数调用Invoke-Command,如下所示:

代码语言:javascript
复制
$result = Invoke-Command  -ComputerName localhost  -FilePath "\1.ps1"
票数 1
EN

Stack Overflow用户

发布于 2020-05-24 03:44:12

我知道这是一个老帖子,但我希望它能帮助一些人。

代码语言:javascript
复制
[CmdletBinding()]
param()
$barScriptBlock = {
    function GetBar() {
        $bar = "bar"
        $bar
    }
}
$fooScriptBlock = {
    function GetFoo() {     
        $foo = "foo"
        $bar = GetBar
        $foo
        $bar
    }
}
# Concatenate all functions into a script block; add a parameter for extra credit.
$scriptBlockString = @"
param(`$hello)
$($barScriptBlock.ToString())
$($fooScriptBlock.ToString())
`$hello
GetFoo
"@
Write-Verbose $scriptBlockString
# Convert combined string to script block.
$finalScriptBlock = [ScriptBlock]::Create($scriptBlockString)
# Run synchronously, passing runtime parameter.
$result = & $finalScriptBlock "Hola"
# (Async results would not be reiably accessed here yet.)
Write-Host $result[0]
Write-Host $result[1]
Write-Host $result[2]
票数 1
EN

Stack Overflow用户

发布于 2021-03-17 23:42:09

Joe Zamora's answer的基础上,这里有一个我认为更适合这个问题的命令:

代码语言:javascript
复制
$result = Invoke-Command -Credential $cred -ScriptBlock ([ScriptBlock]::Create("${function:GetFoo}; ${function:GetBar}; GetFoo"))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13100945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档