В команде разработчиков я хотел бы, чтобы те же тестовые скрипты выполнялись локально разработчиком или удаленно с помощью нашей тестовой платформы.Локальное или удаленное выполнение сценария 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 - неправильный способ сделать это, но я здесь совсем потерялся. Заранее спасибо
Идея этого сценария заключается в том, чтобы использовать его в начале каждого тестового скрипта, чтобы пользователям не приходилось писать скриптовый блок, который повторял параметры скрипта. Я хотел бы, чтобы он был как можно более общим, с реальным списком параметров, объявленным только один раз в именованном блоке параметров. Например, следующим шагом будет поиск параметров типа файла и их подготовка в блоке сценария. – FoxAlfaBravo
Если я правильно понимаю комментарий, вы обеспокоены тем, что пользовательский скрипт встроен в пример как $ command. Вы можете так же легко заполнить это, выполнив Get-Content в файле сценария и используя путь к скрипту в качестве параметра. Вы не можете использовать $ using в splat, как они пытались. Он должен быть указан для каждой ссылки на переменные внутри скрипта, но если вы это сделаете, скрипт не работает локально. Это дает вам блок сценариев, который будет работать локально или удаленно, без необходимости манипулировать областями переменных в скрипте. – mjolinor