2017-02-21 10 views
1

я есть ниже пс скриптКак передать аргументы в функции Powershell

Function Publish 
{ 
Param(
    [parameter(Mandatory=$true)] 
    [String] 
    $RELEASEDIR, 
    [parameter(Mandatory=$true)] 
    [String] 
    $SERVICENAME, 
    [parameter(Mandatory=$true)] 
    [String] 
    $SERVER 
    ) 
Get-ChildItem "$RELEASEDIR\*" 
$service = Get-Service -Name $SERVICENAME -Computername $SERVER -ErrorAction SilentlyContinue 
$service.Status 
} 
Publish 

Как я выполнения этого

PS C:\Release\RPCPS> .\RPCPublish.ps1 -RELEASEDIR "C:\Location" -SERVICENAME "value" -SERVER "server" 
cmdlet Publish at command pipeline position 1 
Supply values for the following parameters: 
RELEASEDIR: 

Даже после передачи аргументов во время выполнения, скрипт снова ожидает. Я делаю что-то не так. Пожалуйста, помогите мне

+0

. \ RPCPublish.ps1 =/= ваша функция 'publish' – Matt

+0

Не понял – Kally

+0

[dotsource] (https://ss64.com/ps/source.html) сценарий и сделать' опубликовать -arg1 -arg2 -arg3', а также рассмотреть возможность изменения имени функции на формат verb-noun. – 4c74356b41

ответ

5

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

Param(
    [parameter(Mandatory=$true)] 
    [String] 
    $RELEASEDIR, 
    [parameter(Mandatory=$true)] 
    [String] 
    $SERVICENAME, 
    [parameter(Mandatory=$true)] 
    [String] 
    $SERVER 
    ) 
Get-ChildItem "$RELEASEDIR\*" 
$service = Get-Service -Name $SERVICENAME -Computername $SERVER -ErrorAction SilentlyContinue 
$service.Status 

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

Если, с другой стороны, вы хотите установить функцию (повторно используемую), удалите только последнюю строку из вашего скрипта, которая вызывает функцию без параметров (поэтому она запрашивает обязательные параметры каждый раз).

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

Publish -RELEASEDIR "C:\Release\Batchfile" -SERVICENAME "AmazonSSMAgent" -SERVER "10.0.1.91" 

независимо от файла сценария.

+0

Как я могу выполнить то же самое в Jenkins – Kally

+0

Не знаю, я не делаю Дженкинса. Возможно, это будет полезно: https://hodgkins.io/automating-with-jenkins-and-powershell-on-windows-part-1 – TToni

1

Ваш скрипт создает функцию «Опубликовать» (строки 1-17), а затем вызывает ее без параметров (строка 18). Поскольку вы определили параметры как обязательные (строки 4, 7, 10), неспособность предоставить параметры при вызове функции (строка 18), PowerShell запрашивает значения для неподдерживаемых параметров.

Поставка параметров самому файлу сценария не помогает; нет механизма для «автоматического» передачи этих параметров во что бы то ни было в сценарии (вам нужно было бы явно закодировать скрипт для этого).

Как предположил Мэтт в комментариях, dot-source ваш скрипт после удаления строки 18, затем вызывайте вашу функцию, явно передавая параметры (publish -RELEASEDIR "C:\Release\Batchfile" -SERVICENAME "AmazonSSMAgent" -SERVER "10.0.1.91").

0

Так, согласно моему пониманию вашего требования, чтобы запустить Функции и вы должны скомпилировать сценарии также в Дженкинс.

Вы можете сделать что-то вроде этого:

Допустим, ваше имя скрипта RPCPublish.ps1 и путь D: \ Folder.

И я могу видеть ваше имя функции: .

Так что в вашем случае,

powershell -command "& { D:\folder\RPCPublish.ps1; Publish }" 

Вы можете передать параметры после этого в блоке сценария.

Надеюсь, вы поняли мой подход.

Я считаю, что вы можете включить эти вещи сейчас.

0

Я использовал плагин PS и выполнял то же самое.

. "C:\Release\RPCPS\RPCPublish.ps1" 
FUunctionName -RELEASEDIR "C:\Air\BTP\src\Fortius.Services.Air\Fortius.Services.Air.RPC.Host\bin\Release" -SERVICENAME "ServicesAirWindowsService" -SERVER "$env:SERVER" -DISPLAYNAME "Fortius Services Air RPC Service" -BINPATH "D:\Build\RPC\Fortius.RPC.Air\WorldVentures.Fortius.Services.Air.RPC.Host.exe" -DESCRIPTION "This service hosts Fortius Services Air RPC service" -DESTINATION "d$\Build\RPC\Fortius.RPC.Air"