2015-10-08 3 views
0

В команде разработчиков я хотел бы, чтобы те же тестовые скрипты выполнялись локально разработчиком или удаленно с помощью нашей тестовой платформы.Локальное или удаленное выполнение сценария powershell с общими параметрами

Вот что я хотел бы использовать в качестве помещения для каждого сценария

# 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 - неправильный способ сделать это, но я здесь совсем потерялся. Заранее спасибо

ответ

0

Вот мой взгляд на проблему в состоянии сделать как локальное, так и удаленное выполнение, используя именованные параметры:

$IP = '192.168.0.1' 
$User = 'Test User' 
$Password = '[email protected]!' 

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

$command = 'new-something' 

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

Пуск с хэш-таблице параметров, используя локальные varibles, а затем использовать этот :

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

для создания блока сценария команды с параметрами inline и уже расширенными значениями. Теперь этот блок сценариев готов к запуску локально (либо путем вызова с помощью &, либо с помощью точки доступа), либо удаленно используя Invoke-Command.

$ScriptBlock 
new-something -IP: 192.168.0.1 -User: Test User -Password: [email protected]! 

Нет обзорное с $Using: или -argumentlist требуется.

Edit: Вот пример использования сценария, а не одной командой:

$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 
+0

Идея этого сценария заключается в том, чтобы использовать его в начале каждого тестового скрипта, чтобы пользователям не приходилось писать скриптовый блок, который повторял параметры скрипта. Я хотел бы, чтобы он был как можно более общим, с реальным списком параметров, объявленным только один раз в именованном блоке параметров. Например, следующим шагом будет поиск параметров типа файла и их подготовка в блоке сценария. – FoxAlfaBravo

+0

Если я правильно понимаю комментарий, вы обеспокоены тем, что пользовательский скрипт встроен в пример как $ command. Вы можете так же легко заполнить это, выполнив Get-Content в файле сценария и используя путь к скрипту в качестве параметра. Вы не можете использовать $ using в splat, как они пытались. Он должен быть указан для каждой ссылки на переменные внутри скрипта, но если вы это сделаете, скрипт не работает локально. Это дает вам блок сценариев, который будет работать локально или удаленно, без необходимости манипулировать областями переменных в скрипте. – mjolinor

Смежные вопросы