Что такое «правильный» способ передачи параметров в функции powershell - PullRequest
0 голосов
/ 11 апреля 2020

Кто-нибудь написал руководство "PowerShell Gotchas для VBA-кодеров"? Я пытаюсь научить себя Powershell, у меня есть некоторый опыт в VBA. Что такое «правильный» метод определения и передачи параметров в функции.

Вот мой тестовый код:

Function Pass-Parameters1
{param( $s1,  $s2)
write-host Pass-Parameters1 s1: $s1
Write-Host Pass-Parameters1 s2: $s2
return $s1 + $s2
}

Function Pass-Parameters2($ss1, $ss2){
Write-Host Pass-Parameters2 ss1: $ss1
Write-Host Pass-Parameters2 ss2: $ss2
return $ss1 + $ss2
}

$x = "Hello "
$y = "There!!"

$z = Pass-Parameters1 -s1 $x -s2  $y
$zz = Pass-Parameters2 $x, $y
$zzz = Pass-Parameters2 $x $y

Write-Host 1..Z = $z
write-host 1.ZZ = $zz
Write-Host 1ZZZ = $zzz

Вот результаты:

Pass-Parameters1 s1: Hello 
Pass-Parameters1 s2: There!!
Pass-Parameters2 ss1: Hello  There!!
Pass-Parameters2 ss2: 
Pass-Parameters2 ss1: Hello 
Pass-Parameters2 ss2: There!!
1..Z = Hello There!!
1.ZZ = Hello  There!! 
1ZZZ = Hello There!!

Какой метод рекомендуется, пример 1 или пример 2? Мне нужно многое узнать о Powershell, поскольку $zz = Pass-Parameters2 $x, $y не сделал того, что я ожидал, и именно так я бы назвал функцию в VBA. Я предполагаю, что $z = Pass-Parameters1 -s1 $x -s2 $y является рекомендуемым методом вызова функции, поскольку нет никакой двусмысленности.

Любые комментарии или предложения приветствуются!

Ответы [ 4 ]

0 голосов
/ 11 апреля 2020

Аргументы, которые вы передаете в функцию, добавляются в массив с именем 'args'. Этот массив args [] можно использовать следующим образом:

    Function TestFunction(){
     # access your arguments in the args array
        Write-Host args[0]
    }

    TestFunction $param1 $param2 $param3

Или вы можете явно указать аргументы:

    Function TestFunction($test1, $test2, $test3){
     # access your arguments in the args array
        Write-Host $test1
    }

TestFunction $param1 $param2 $param3
0 голосов
/ 11 апреля 2020

Ваш код PowerShell выглядит очень необычно для пользователей PowerShell imho. Вот пример того, как я отформатировал бы ваши функции:

function Pass-Parameters1 {
    Param(
        $s1,
        $s2
    )
    Write-Host "Pass-Parameters1 s1: $s1"
    Write-Host "Pass-Parameters1 s2: $s2"
    return $s1 + $s2
}

function Pass-Parameters2($ss1, $ss2) {
    Write-Host "Pass-Parameters2 ss1: $ss1"
    Write-Host "Pass-Parameters2 ss2: $ss2"
    return $ss1 + $ss2
}

Обе версии действительны. По моему опыту, первый метод более распространен, потому что он более понятен, если у вас много параметров с определениями типов, переключателями, обязательными тегами, значениями по умолчанию, ограничениями, позиционной информацией или другой дополнительной информацией. Ознакомьтесь с этой документацией, чтобы увидеть, насколько сложным может быть определение даже одного параметра.

Вы можете использовать синтаксис, подобный function Pass-Parameters2($ss1, $ss2) из других языков, но, как вы будете называть такие функции в PowerShell, как Pass-Parameters2 -ss1 "String1" -ss2 "String2", в любом случае вы не будете использовать синтаксис вызова, используемый в других языках, таких как Pass-Parameters2("String1", "String2").

0 голосов
/ 11 апреля 2020

Спасибо вам и Caius Jard, и Thomas за ваш вклад. Важная часть информации, которую я обнаружил: Pass-Parameters2 $x, $y передает $ x и $ y в виде массива первой переменной в функции, тогда как Pass-Parameters2 $x $y передает две переменные.

Мне нужно прочитать несколько больше базовых c руководств по Powershell, чтобы изучить тонкости синтаксиса и не думать в режиме VBA.

0 голосов
/ 11 апреля 2020

Для указания параметров функции я бы выбрал форму 2, потому что для меня 1 слишком многословен / я хорошо привык. net языки, где functionname(argument1,argument2) / большинство C -подобного программирования языки не имеют отдельной строки внутри функции, которая описывает параметры, но это личное предпочтение


Вы можете указать имя аргумента с префиксом дефиса и указать аргументы в любом порядке. :

$z = Pass-Parameters1 -s1 $x -s2 $y
$z = Pass-Parameters1 -s2 $y -s1 $x 

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

$zzz = Pass-Parameters2 $x $y

Любой из них является правильным, и большинство языков имеют позиционные и именованные аргументы. Преимущество использования подхода с именованным аргументом состоит в том, что вы не хотите указывать все параметры. Также необходимо учитывать, что разработчики Power Shell могут заставить некоторые аргументы быть позиционными, а другие - именованными, поэтому иногда вам нужно указывать имена

Например, Write-Host может выводить массив вещей для вывода в качестве первого аргумента и имеет параметры для того, чтобы разделить их в качестве именованного аргумента (третий, как написано). Если вы хотели передать массив, но не указали второй аргумент (как написано, который управляет поведением новой строки), вам нужно Write-Host $someArray -separator ":" - он смешивает позиционный и именованный А и должен быть представлен таким образом из-за способа позиционного / именованного был указан (Microsoft), в противном случае для записи просто будет дано больше вещей для вывода

Если вы указываете все аргументы или вам нужно только указать, например, первые 3 из 5 аргументов, используйте что более кратко, но читабельно. Если у вас есть (ужасная) привычка присваивать имена строковым переменным s1, s2, s3, то вызов Add-Person -name $s1 -address $s2 -ssn $s3 делает вещи читаемыми. Или используйте правильные имена переменных и Add-Person $name $address $ssn, потому что более кратко / избыточно указывать имена параметров, когда переменная довольно неплохо описывает данные. Подумайте об использовании имен, если вы передаете строковые литералы: Add-Person "Markus Crescent" "Lee Street" "12345" - это имя и адрес (хорошо, это растяжение, но подумайте, являются ли эти строки просто путями, такими как «файл для хранения» и «файл для удаления») ")


Этот преобразовал ваши X и Y в массив, передал его в первый параметр и ничего не передавал для второго ... который Write-Host затем должным образом напечатал содержимое массива в одну строку:

$zz = Pass-Parameters2 $x, $y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...