Когда вы достигли предела. Установите следующее:
utf8
VARCHAR(255)
utf8mb4
VARCHAR(191)
Параметры определяются для области действия функции, а не для сценария.
То, что вы хотите, это раздел 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
В дополнить полезный и эффективный ответ Марса :
PowerShell имеет две в значительной степени эквивалентные синтаксические формы для определения параметров [11109 ] - оставляя определения PSv5 + class
в стороне [1] sup>:
Примечание. Для краткости списки параметров помещаются в одну строку ниже; однако обе синтаксические формы позволяют размещать отдельные параметры в отдельной строке. sup>
Только для функций: :
[ 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
li> ul> [1151 ] Атрибуты параметра , обычно, но не исключительно через атрибут [Parameter()]
; среди прочего, последний определяет, является ли связанный параметр обязательным ; Например:
[Parameter(Mandatory=$true)] [int] $foo
li> ul> Выше оператора 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 . Sup> [ 11108]