首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Invoke-Command传递命名参数?

如何使用Invoke-Command传递命名参数?
EN

Stack Overflow用户
提问于 2010-11-19 22:08:31
回答 4查看 171.1K关注 0票数 80

我有一个可以通过Invoke-Command远程运行的脚本

代码语言:javascript
复制
Invoke-Command -ComputerName (Get-Content C:\Scripts\Servers.txt) `
               -FilePath C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1

只要我使用默认参数,它就能正常工作。但是,该脚本有两个命名开关参数(-Debug和-Clear)

如何通过Invoke-Command传递切换后的参数?我已经尝试了-ArgumentList,但我得到了错误,所以我一定是语法错误或什么。任何帮助都是非常感谢的。

EN

回答 4

Stack Overflow用户

发布于 2016-05-24 04:01:54

我的解决方案是使用[scriptblock]:Create动态编写脚本块

代码语言:javascript
复制
# Or build a complex local script with MARKERS here, and do substitutions
# I was sending install scripts to the remote along with MSI packages
# ...for things like Backup and AV protection etc.

$p1 = "good stuff"; $p2 = "better stuff"; $p3 = "best stuff"; $etc = "!"
$script = [scriptblock]::Create("MyScriptOnRemoteServer.ps1 $p1 $p2 $etc")
#strings get interpolated/expanded while a direct scriptblock does not

# the $parms are now expanded in the script block itself
# ...so just call it:
$result = invoke-command $computer -script $script

传递参数非常令人沮丧,尝试各种方法,例如,

-arguments$using:p1等,这一切都像预期的那样工作,没有问题。

由于我以这种方式控制了创建[scriptblock] (或脚本文件)的字符串的内容和变量扩展,因此“调用命令”咒语没有什么真正的问题。

(这不应该那么难。:)

票数 7
EN

Stack Overflow用户

发布于 2017-04-20 17:02:17

我怀疑这是一个新特性,因为这篇文章是创建的--使用$Using:var向脚本块传递参数。如果脚本已经在计算机上或位于与计算机相关的已知网络位置,那么传递参数就很简单了

以主要的例子为例:

代码语言:javascript
复制
icm -cn $Env:ComputerName { 
    C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1 -one "uno" -two "dos" -Debug -Clear $Using:Clear
}
票数 5
EN

Stack Overflow用户

发布于 2016-10-27 22:19:31

我需要一些东西来调用带有命名参数的脚本。我们的策略是不使用参数的序号定位,并要求参数名称。

我的方法类似于上面的方法,但是获取您想要调用的脚本文件的内容,并发送一个包含参数和值的参数块。

这样做的优点之一是,您可以选择将哪些参数发送到脚本文件,从而允许使用默认值的非强制参数。

假设临时路径中有一个名为"MyScript.ps1“的脚本,该脚本具有以下参数块:

代码语言:javascript
复制
[CmdletBinding(PositionalBinding = $False)]
param
(
    [Parameter(Mandatory = $True)] [String] $MyNamedParameter1,
    [Parameter(Mandatory = $True)] [String] $MyNamedParameter2,
    [Parameter(Mandatory = $False)] [String] $MyNamedParameter3 = "some default value"
)

这就是我从另一个脚本调用这个脚本的方式:

代码语言:javascript
复制
$params = @{
    MyNamedParameter1 = $SomeValue
    MyNamedParameter2 = $SomeOtherValue
}

If ($SomeCondition)
{
    $params['MyNamedParameter3'] = $YetAnotherValue
}

$pathToScript = Join-Path -Path $env:Temp -ChildPath MyScript.ps1

$sb = [scriptblock]::create(".{$(Get-Content -Path $pathToScript -Raw)} $(&{
        $args
} @params)")
Invoke-Command -ScriptBlock $sb

我已经在很多场景中使用过它,它工作得非常好。您偶尔需要做的一件事是在参数值赋值块两边加上引号。当值中包含空格时,总是会出现这种情况。

例如,此参数块用于调用一个脚本,该脚本将各种模块复制到包含空格字符的PowerShell C:\Program Files\WindowsPowerShell\Modules使用的标准位置。

代码语言:javascript
复制
$params = @{
        SourcePath      = "$WorkingDirectory\Modules"
        DestinationPath = "'$(Join-Path -Path $([System.Environment]::GetFolderPath('ProgramFiles')) -ChildPath 'WindowsPowershell\Modules')'"
    }

希望这能有所帮助!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4225748

复制
相关文章

相似问题

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