我有一个可以通过Invoke-Command远程运行的脚本
Invoke-Command -ComputerName (Get-Content C:\Scripts\Servers.txt) `
-FilePath C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1
只要我使用默认参数,它就能正常工作。但是,该脚本有两个命名开关参数(-Debug和-Clear)
如何通过Invoke-Command传递切换后的参数?我已经尝试了-ArgumentList,但我得到了错误,所以我一定是语法错误或什么。任何帮助都是非常感谢的。
发布于 2016-05-24 04:01:54
我的解决方案是使用[scriptblock]:Create
动态编写脚本块
# 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]
(或脚本文件)的字符串的内容和变量扩展,因此“调用命令”咒语没有什么真正的问题。
(这不应该那么难。:)
发布于 2017-04-20 17:02:17
我怀疑这是一个新特性,因为这篇文章是创建的--使用$Using:var向脚本块传递参数。如果脚本已经在计算机上或位于与计算机相关的已知网络位置,那么传递参数就很简单了
以主要的例子为例:
icm -cn $Env:ComputerName {
C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1 -one "uno" -two "dos" -Debug -Clear $Using:Clear
}
发布于 2016-10-27 22:19:31
我需要一些东西来调用带有命名参数的脚本。我们的策略是不使用参数的序号定位,并要求参数名称。
我的方法类似于上面的方法,但是获取您想要调用的脚本文件的内容,并发送一个包含参数和值的参数块。
这样做的优点之一是,您可以选择将哪些参数发送到脚本文件,从而允许使用默认值的非强制参数。
假设临时路径中有一个名为"MyScript.ps1“的脚本,该脚本具有以下参数块:
[CmdletBinding(PositionalBinding = $False)]
param
(
[Parameter(Mandatory = $True)] [String] $MyNamedParameter1,
[Parameter(Mandatory = $True)] [String] $MyNamedParameter2,
[Parameter(Mandatory = $False)] [String] $MyNamedParameter3 = "some default value"
)
这就是我从另一个脚本调用这个脚本的方式:
$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
使用的标准位置。
$params = @{
SourcePath = "$WorkingDirectory\Modules"
DestinationPath = "'$(Join-Path -Path $([System.Environment]::GetFolderPath('ProgramFiles')) -ChildPath 'WindowsPowershell\Modules')'"
}
希望这能有所帮助!
https://stackoverflow.com/questions/4225748
复制相似问题