使用通用参数本地或远程执行powershell脚本

时间:2015-10-08 17:09:17

标签: powershell remote-access invoke-command splat

在开发团队中,我希望由开发人员在本地执行相同的测试脚本,或者由我们的测试平台远程执行。

以下是我想用作每个脚本的前提

# Test local/remote execution by reading C:\ directory
param(
    [switch] $verbose,
    [switch] $remote,
    [string] $ip,
    [string] $user,
    [string] $password
    #Add here script specific parameters
)

Write-Host "Command invokation incoming parameter count : " $psboundparameters.count

if ($remote) {
    $Params = @{}
    $RemoteParams = @{}
    $pass = ConvertTo-SecureString -String $password -AsPlainText -Force 

    $Params.Credential = new-object -TypeName System.management.automation.PSCredential -argumentlist $user, $pass
    $Params.ComputerName = $ip
    $Params.FilePath = $MyInvocation.MyCommand.Name
    $null = $psboundparameters.Remove('remote')
    $null = $psboundparameters.Remove('ip')
    $null = $psboundparameters.Remove('user')
    $null = $psboundparameters.Remove('password')

    foreach($psbp in $PSBoundParameters.GetEnumerator())
    {
        $RemoteParams.$($psbp.Key)=$psbp.Value
    }
    Write-Host $RemoteParams
    Invoke-Command @Params @Using:RemoteParams
    Exit 
}

Write-Host "Command execution incoming parameters count : "    $psboundparameters.count

# Here goes the test 
Get-ChildItem C:\

然而,当我执行此操作时,我收到以下错误:

Invoke-Command : A positional parameter cannot be found that accepts argument '$null'.

似乎 @Using:RemoteParams 不是这样做的正确方法,但我在这里很丢失。 提前致谢

1 个答案:

答案 0 :(得分:1)

这是我对使用命名参数进行本地和远程执行的问题的看法:

$IP = '192.168.0.1'
$User = 'Test User'
$Password = 'P@ssW0rd!' 

$params = @{
IP = $IP
User = $User
Password = $Password
}

$command = 'new-something'

$ScriptBlock = [Scriptblock]::Create("$command $(&{$args} @Params)")

从参数的哈希表开始,使用局部变量,然后使用:

[Scriptblock]::Create("$command $(&{$args} @Params)")

创建命令的脚本块,参数内联,值已经扩展。现在该脚本块已准备好在本地运行(通过&或点源调用),或远程使用Invoke-Command

$ScriptBlock
new-something -IP: 192.168.0.1 -User: Test User -Password: P@ssW0rd!

不需要$Using:-argumentlist确定范围。

编辑:这是使用脚本而不是单个命令的示例:

$path = 'c:\windows'
$filter = '*.xml'

$Params = 
@{
   Path = $path
   Filter = $filter
  }

$command = @'
{
  Param (
    [String]$path,
    [String]$Filter
   )

 Get-childitem -Path $path -Filter $filter
}
'@

$ScriptBlock = [Scriptblock]::Create(".$command $(&{$args} @Params)")

在本地运行:

 Invoke-Command $ScriptBlock

或只是:

 .$ScriptBlock

远程运行:

 Invoke-Command -Scriptblock $ScriptBlock -ComputerName Server1