2016-11-30 16 views
1

Я пытаюсь создать простую задачу TFS vNext, используя Powershell для выполнения сценария Powershell.Проблема с использованием задачи TFS vNext: параметр не может быть найден, который соответствует имени параметра

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

##[error]System.Management.Automation.ParameterBindingException: A parameter cannot be found that matches parameter name 'PoolName'. 

Мой task.json, как показано ниже.

{ 
    "id": "7fe28fb2-c323-4494-beb6-b5c5939b09e7", 
    "name": "ManageIIS", 
    "friendlyName": "ManageIIS", 
    "description": "ManageIIS", 
    "helpMarkDown": "ManageIIS", 
    "category": "Utility", 
    "visibility": [ 
     "Build" 
    ], 
    "author": "Baskar Lingam", 
    "version": { 
     "Major": 1, 
     "Minor": 0, 
     "Patch": 3 
    }, 
    "demands": [], 
    "minimumAgentVersion": "1.83.0", 
    "groups": [ 
     { 
      "name": "advanced", 
      "displayName": "Advanced", 
      "isExpanded": false 
     } 
    ], 
    "instanceNameFormat": "ManageIIS", 
    "inputs": [ 
    { 
     "name": "PoolName", 
     "type": "string", 
     "label": "Application Pool Name", 
     "required": true, 
     "defaultValue": "AppPoolName" 
    }, 
    { 
     "name": "AppPoolAction", 
     "type": "pickList", 
     "label": "App Pool Action (Stop or Start)", 
     "required": true, 
     "defaultValue": "", 
     "helpMarkDown": "Name of the Database", 
     "options": { 
     "Stop": "Stop App Pool", 
     "Start": "Start App Pool" 
     } 
    }, 
    { 
     "name": "ResetIIS", 
     "type": "boolean", 
     "label": "Reset IIS", 
     "defaultValue": "false", 
     "required": true, 
     "helpMarkDown": "To reset IIS on a web server" 
    } 
    ], 
    "execution": { 
     "PowerShell": { 
      "target": "ManageIIS.ps1", 
      "argumentFormat": "", 
      "workingDirectory": "$(currentDirectory)" 
     } 
    } 
} 

И мой сценарий Powershell здесь.

##################################################################### 

# Author  : Baskar Lingam Ramachandran 
# Created Date : 25th Nov 2016 
# Updated Date : 30th Nov 2016 

###################################################################### 

[CmdletBinding()] 
Param() 

Trace-VstsEnteringInvocation $MyInvocation 

try 
{ 
    # Get the inputs. 
    [string]$PoolName = Get-VstsInput -Name PoolName 
    [string]$AppPoolAction = Get-VstsInput -Name AppPoolAction 
    [bool]$ResetIIS = Get-VstsInput -Name ResetIIS -AsBool 

    # Load the require module to manage IIS 
    <#if(-not(Get-Module WebAdministration)) 
    { 
     Import-Module WebAdministration 
    } 
    #> 

    # Code for App pool stop or start 
    if (($AppPoolAction -eq "Stop") -or ($AppPoolAction -eq "Start")) 
    { 
     if(-not($PoolName)) 
      { 
       Write-Host "`t`tApp pool name is not provided. Please provide the same.`r`n" -ForegroundColor Green 
      } 
     else 
      { 
       if($AppPoolAction -eq "Stop") 
       { 
        if(Test-Path IIS:\AppPools\$PoolName) 
        { 
         Write-Host "`t`tApp Pool $PoolName exists`r`n" 
         if(-not((Get-WebAppPoolState $PoolName).Value -eq "stopped")) 
         { 

          Write-Host "`t`t-------------------------------------------------`r`n" 
          Write-Host "`t`tStopping application pool $PoolName`r`n" 
          Write-Host "`t`t-------------------------------------------------`r`n" 

          Write-Host "`t`tApp Pool $PoolName is not stopped. Stopping it now.`r`n" -ForegroundColor DarkYellow 
          Stop-WebAppPool $PoolName 
          Write-Host "`t`tThe command execution is complete.`r`n" -ForegroundColor Cyan 
          $appPoolState = Get-WebAppPoolState $PoolName 
          Write-Host "`t`tThe current state of the app pool $PoolName is $($appPoolState.Value).`r`n" -ForegroundColor DarkMagenta 
         } 
         else 
         { 
          Write-Host "`t`tApp Pool $PoolName is already stopped.`r`n" -ForegroundColor DarkGreen 
         } 
        } 
        else 
        { 
         Write-Host "`t`tApp Pool $PoolName does not exist`r`n" -ForegroundColor DarkRed 
        }    
       } 
       if($AppPoolAction -eq "Start") 
       { 
        if(Test-Path IIS:\AppPools\$PoolName) 
        { 
         Write-Host "`t`tApp Pool $PoolName exists`r`n" 
         if(-not((Get-WebAppPoolState $PoolName).Value -eq "Started")) 
         { 

          Write-Host "`t`t-------------------------------------------------`r`n" 
          Write-Host "`t`tStarting application pool $PoolName`r`n" 
          Write-Host "`t`t-------------------------------------------------`r`n" 

          Write-Host "`t`tApp Pool $PoolName is not started. Starting it now.`r`n" -ForegroundColor DarkYellow 
          Start-WebAppPool $PoolName 
          Write-Host "`t`tThe command execution is complete.`r`n" -ForegroundColor Cyan 
          $appPoolState = Get-WebAppPoolState $PoolName 
          Write-Host "`t`tThe current state of the app pool $PoolName is $($appPoolState.Value).`r`n" -ForegroundColor DarkMagenta 
         } 
         else 
         { 
          Write-Host "`t`tApp Pool $PoolName is already started.`r`n" -ForegroundColor DarkGreen 
         } 
        } 
        else 
        { 
         Write-Host "`t`tApp Pool $PoolName does not exist`r`n" -ForegroundColor DarkRed 
        }    
       } 
      } 
     } 

    if ($ResetIIS -eq "true") 
    { 
     iisreset -stop -noforce 
     if ($LASTEXITCODE -eq 0) 
     { 
      Write-Host "`t`tInternet services successfully stopped`r`n" -ForegroundColor DarkGreen 
     } 
     iisreset -start -noforce 
     if ($LASTEXITCODE -eq 0) 
     { 
      Write-Host "`t`tInternet services successfully started`r`n" -ForegroundColor DarkRed 
     } 
    } 

} finally { 
    Trace-VstsLeavingInvocation $MyInvocation 
} 

У меня есть еще одна простая задача, которая не принимает никаких параметров и работает отлично.

Любые указатели?

Что мне не хватает?

ответ

3

Если вы используете VSTS сборки Task SDK вы должны использовать Powershell 3 ..

"исполнение": { "PowerShell3": { "цель": "ManageIIS.ps1"}}

2

Из контекста сценария ошибки, я могу видеть, что ошибка, которую вы получили в настоящее время происходит потому, что PowerShell не может получить значение «PoolName» в «Get-VstsInput» команда ,

Во-вторых, если вы передаете параметры «на лету» в сценарии, вы должны использовать параметры внутри параметра.

Я бы порекомендовал вам использовать Args [0], Args [1] и т. Д. Как метод передачи параметров. В основном мы используем params в функции.

Я считаю, что вы уже скомпилированные функции ("Trace-VstsEnteringInvocation "и" Get-VstsInput") где-то раньше; Иными словами, это привело бы к ошибке как непризнанные термины.

Согласно вашему сценарию, я немного изменил настройки и также добавил комментарии к скриптам; Ниже приведен сценарий:

##################################################################### 

# Author  : Baskar Lingam Ramachandran 
# Created Date : 25th Nov 2016 
# Updated Date : 30th Nov 2016 

###################################################################### 

[CmdletBinding()] 
Param($PoolName,$AppPoolAction,$ResetIIS) # Taking the input as parameters 

# I would suggest you to make the functions as Global so that you can use it anywhere freely and call from any block. 
Trace-VstsEnteringInvocation $MyInvocation 

try 
{ 

    # Get the inputs. 
    [string]$PoolName = Get-VstsInput -Name PoolName 
    "The value of PoolName is $PoolName" # This helps in input validation, we can check it if it is returning the proper value or not. 
    [string]$AppPoolAction = Get-VstsInput -Name AppPoolAction 
    [bool]$ResetIIS = Get-VstsInput -Name ResetIIS -AsBool 

    # Load the require module to manage IIS 
    <#if(-not(Get-Module WebAdministration)) 
    { 
     Import-Module WebAdministration 
    } 
    #> 

    # Code for App pool stop or start 
    if (($AppPoolAction -eq "Stop") -or ($AppPoolAction -eq "Start")) 
    { 
     if(-not($PoolName)) 
      { 
       Write-Host "`t`tApp pool name is not provided. Please provide the same.`r`n" -ForegroundColor Green 
      } 
     else 
      { 
       if($AppPoolAction -eq "Stop") 
       { 
        if(Test-Path IIS:\AppPools\$PoolName) 
        { 
         Write-Host "`t`tApp Pool $PoolName exists`r`n" 
         if(-not((Get-WebAppPoolState $PoolName).Value -eq "stopped")) 
         { 

          Write-Host "`t`t-------------------------------------------------`r`n" 
          Write-Host "`t`tStopping application pool $PoolName`r`n" 
          Write-Host "`t`t-------------------------------------------------`r`n" 

          Write-Host "`t`tApp Pool $PoolName is not stopped. Stopping it now.`r`n" -ForegroundColor DarkYellow 
          Stop-WebAppPool $PoolName 
          Write-Host "`t`tThe command execution is complete.`r`n" -ForegroundColor Cyan 
          $appPoolState = Get-WebAppPoolState $PoolName 
          Write-Host "`t`tThe current state of the app pool $PoolName is $($appPoolState.Value).`r`n" -ForegroundColor DarkMagenta 
         } 
         else 
         { 
          Write-Host "`t`tApp Pool $PoolName is already stopped.`r`n" -ForegroundColor DarkGreen 
         } 
        } 
        else 
        { 
         Write-Host "`t`tApp Pool $PoolName does not exist`r`n" -ForegroundColor DarkRed 
        }    
       } 
       if($AppPoolAction -eq "Start") 
       { 
        if(Test-Path IIS:\AppPools\$PoolName) 
        { 
         Write-Host "`t`tApp Pool $PoolName exists`r`n" 
         if(-not((Get-WebAppPoolState $PoolName).Value -eq "Started")) 
         { 

          Write-Host "`t`t-------------------------------------------------`r`n" 
          Write-Host "`t`tStarting application pool $PoolName`r`n" 
          Write-Host "`t`t-------------------------------------------------`r`n" 

          Write-Host "`t`tApp Pool $PoolName is not started. Starting it now.`r`n" -ForegroundColor DarkYellow 
          Start-WebAppPool $PoolName 
          Write-Host "`t`tThe command execution is complete.`r`n" -ForegroundColor Cyan 
          $appPoolState = Get-WebAppPoolState $PoolName 
          Write-Host "`t`tThe current state of the app pool $PoolName is $($appPoolState.Value).`r`n" -ForegroundColor DarkMagenta 
         } 
         else 
         { 
          Write-Host "`t`tApp Pool $PoolName is already started.`r`n" -ForegroundColor DarkGreen 
         } 
        } 
        else 
        { 
         Write-Host "`t`tApp Pool $PoolName does not exist`r`n" -ForegroundColor DarkRed 
        }    
       } 
      } 
     } 

    if ($ResetIIS -eq "true") 
    { 
     iisreset -stop -noforce 
     if ($LASTEXITCODE -eq 0) 
     { 
      Write-Host "`t`tInternet services successfully stopped`r`n" -ForegroundColor DarkGreen 
     } 
     iisreset -start -noforce 
     if ($LASTEXITCODE -eq 0) 
     { 
      Write-Host "`t`tInternet services successfully started`r`n" -ForegroundColor DarkRed 
     } 
    } 

} finally { 
    Trace-VstsLeavingInvocation $MyInvocation 
} 

Надежда этот ответ хватай/помогает вам. Не стесняйтесь нравиться, потому что это тоже поможет другим.

+0

Я очень ценю ваш ответ. Когда я использую параметры в param(), например 'param ([string] $ PoolName, [string] $ AppPoolAction, [string] $ ResetIIS)' Я начинаю получать ошибки для команд Trace-Vsts * и команд get-VSTSInput. У меня есть стандартный VstsTaskSdk (https://github.com/Microsoft/vsts-task-lib/tree/master/powershell/VstsTaskSdk), хранящийся в папке. Поэтому я просто удалил команды сценария Trace-Vsts * и Get-VstsInput из сценария, и он работал хорошо. –

+0

Великий .. Его все стоит, если он выполняет требование ... :) –

0

Я отвечаю на свой вопрос, так как нашел другой рабочий путь (как используется в задачах VSTS Microsoft https://github.com/Microsoft/vsts-tasks/tree/master/Tasks) в дополнение к ответу от Ranadip Gupta. Я поддержал ответ Ранадипа. Но предоставление моего собственного ответа, поскольку есть еще один способ.

  1. ответ Ranadip Гупты работает хорошо, после я удалил следовой VstsEnteringInvocation, Trace-VstsLeavingInvocation и команды Get-VstsInput из сценария PS1.

    Вам необходимо определить параметры в самом param(), как показано ниже, чтобы этот метод работал.

    парам ([строка] $ PoolName, [строка] $ AppPoolAction [строка] $ ResetIIS)

    Для использования Args [] в PS1, имейте в виду, что аргументы, передаваемые PS1 в формате

    -PoolName TFD -AppPoolAction Стоп -ResetIIS верно

    Таким образом, вы должны использовать $ ($ Args [1]), $ ($ Args [3]), $ ($ Args [5]) для обозначения к значениям, полученным для различных параметров, поскольку $ ($ Args [0]), $ ($ Args [2]), $ ($ Args [4]) относятся к самим параметрам.

  2. Второй способ изменения исполнения task.json от Powershell до Powershell3. С помощью этого метода я мог бы использовать команды Trace-Vsts * и Get-VstsInput. В этом методе param ([string] $ PoolName, [string] $ AppPoolAction, [string] $ ResetIIS) может храниться как param().

    от

    "Исполнение": { "PowerShell": { "цель": "ManageIIS.ps1", }}

    к

    "Исполнение": { "PowerShell3": { "target": "ManageIIS.ps1", } }

 Смежные вопросы

  • Нет связанных вопросов^_^