Правильные значения параметров не переданы в функцию

Когда вы достигли предела. Установите следующее:

  • INNODB utf8 VARCHAR(255)
  • INNODB utf8mb4 VARCHAR(191)
2
задан BKS 18 March 2019 в 15:48
поделиться

2 ответа

Параметры определяются для области действия функции, а не для сценария.

То, что вы хотите, это раздел Param :

param ([string]$param1, [string]$param2)

function TestFunc([string]$param1, [string]$param2) {
    Write-Host "------------------"
    Write-Host $param1
    Write-Host $param2
    Write-Host "------------------"
}
TestFunc $param1 $param2 

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

param ([string]$param1, [string]$param2)

Write-Host "------------------"
Write-Host $param1
Write-Host $param2
Write-Host "------------------"

Или, альтернативно:

param ([string]$param1, [string]$param2)

function TestFunc {
    Write-Host "------------------"
    Write-Host $param1
    Write-Host $param2
    Write-Host "------------------"
}
TestFunc

Или используйте автоматическую переменную $args без определения каких-либо параметров:

function TestFunc {
    Write-Host "------------------"
    Write-Host $args[0]
    Write-Host $args[1]
    Write-Host "------------------"
}
TestFunc foo bar
0
ответ дан marsze 18 March 2019 в 15:48
поделиться

В дополнить полезный и эффективный ответ Марса :

PowerShell имеет две в значительной степени эквивалентные синтаксические формы для определения параметров [11109 ] - оставляя определения PSv5 + class в стороне [1] :

Примечание. Для краткости списки параметров помещаются в одну строку ниже; однако обе синтаксические формы позволяют размещать отдельные параметры в отдельной строке.

  • Только для функций: :

    [ 11147]
  • C / C # -подобный: a , -разделенный список объявлений переменных-параметров внутри (...) после функции [1142 ] имя и до открытия { ; Например:

    function foo ($bar, $baz) {
      # ... 
    }
    
    • Для скриптов и функционируют также , а также блоки сценариев ({ ... }, которые похожи на анонимные функции):

      • для PowerShell : , -разделенный список объявлений переменных параметров внутри param(...) , который должен быть первым оператором внутри Тело (кроме комментариев и using директив):

        # --- Script foo.ps1
        param($bar, $baz)
        
        # ...
        
        
        # --- Function
        # This example is fully equivalent to `foo ($bar, $baz) { ...` above.
        # Note that no () is needed after the function name.
        function foo {
          param($bar, $baz)
          # ...
        }
        
        # --- Script block
        & {
          param($bar, $baz)
          # ...
        } # arguments...
        

    Для краткости, следующее необязательные элементы были опущены выше:

    • В отдельных объявлениях параметров :

      • Ввод ]; например, чтобы объявить параметр $foo как тип [int] (System.Int32):

        • [int] $foo
        • [1151 ] Атрибуты параметра , обычно, но не исключительно через атрибут [Parameter()]; среди прочего, последний определяет, является ли связанный параметр обязательным ; Например:

          • [Parameter(Mandatory=$true)] [int] $foo
        • Выше оператора param(...) только :

          • Атрибут [CmdletBinding()], который делает функцию или сценарий расширенной , с поведением наравне с (скомпилированным) PowerShell командлеты - см. about_Functions_Advanced

        В простых (не продвинутых) скриптах и ​​функциях это также опция вообще не объявлять какие-либо параметры , при этом любые передаваемые аргументы содержатся в автоматической переменной $args , которая является регулярной Массив PowerShell ([object[]]).
        Вы даже можете комбинировать $args с объявленными параметрами: $args затем содержит только те аргументы, которые не привязаны к объявленным.

        Напротив, в усовершенствованных сценариях и функциях вам в основном разрешено передавать только аргументы, которые связываются с объявленными параметрами.


        Когда выбирать, какой синтаксической формы:

        • Файлы сценариев и блоки сценариев должны использовать оператор param(...) - C # -подобный синтаксис недоступен.

        • Функции могут технически использовать C # -подобный синтаксис и param(...) взаимозаменяемо , за исключением , если [ 1124] необходим атрибут, в этом случае работает только синтаксис param(...).

          • Тем не менее, для согласованности и простоты расширяемости (делая функцию расширенной позже), синтаксис param(...), как правило, предпочтительнее .

          • Кроме того, использование C # -подобного синтаксиса часто может привести к путанице в синтаксисе , когда вызывает функцию , учитывая, что командлеты PowerShell и функции вызываются как команды оболочки (без скобок, аргументы, разделенные пробелами), а не как методы C # ; например,
            foo 1 2 (или foo -bar 1 -baz 2), а не foo(1, 2)

        <час>

        [1] объявления методов в class определениях должны использовать C # -подобный синтаксис, и атрибуты параметров не поддерживаются (они поддерживаются только в свойствах ). Точно так же, как методы в нативных типах .NET, методы класса также должны быть с именем с синтаксисом метода - см. этот ответ и раздел справки about_Classes . [ 11108]

0
ответ дан mklement0 18 March 2019 в 15:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: