2012-02-29 11 views
26

Me gustaría que la segunda llamada a la función de esta secuencia de comandos para generar un error:¿Es posible forzar el lanzamiento de la secuencia de comandos de PowerShell si se omite un parámetro requerido?

function Deploy 
{ 

param(

    [Parameter(Mandatory=$true)] 
    [ValidateNotNullOrEmpty()] 
    [string]$BuildName 

    ) 
    Write-Host "Build name is: $BuildName" 

} 

Deploy "Build123" 

Deploy #Currently prompts for input 

Prompting es ideal para usar el script de forma interactiva, pero esto también será ejecutado por nuestro servidor de compilación.

¿Mi mejor opción es hacer una validación personalizada con un if o algo así?

+6

Tenga en cuenta que si ejecuta powershell.exe con el indicador '-NonInteractive', los parámetros obligatorios faltantes provocarán un error y darán como resultado un código de salida distinto de cero para el proceso. –

Respuesta

41

Una vez que el parámetro está marcado como obligatorio, PowerShell solicitará el valor. Dicho esto, si se quita el atributo obligatorio entonces se puede establecer un valor por defecto con una instrucción throw:

function Deploy 
{ 
    param(
     [Parameter()] 
     [ValidateNotNullOrEmpty()] 
     [string]$BuildName=$(throw "BuildName is mandatory, please provide a value.") 
    ) 

    Write-Host "Build name is: $BuildName" 
} 
+0

Extrañamente, para los parámetros de canalización el valor predeterminado aún se evalúa, lo que parece inutilizar esta técnica para arrojar un error cuando falta un parámetro ... al menos si está utilizando parámetros de canalización. – alx9r

+0

[Esta pregunta] (https://stackoverflow.com/questions/33600279) analiza las desafortunadas deficiencias de esta solución si está utilizando parámetros de canalización. – alx9r

15

@Emperor XLII tiene un buen comentario en la pregunta que creo que puede ser una mejor respuesta para algunos casos de uso:

if you run powershell.exe with the -NonInteractive flag, missing mandatory parameters will cause an error and result in a non-zero exit code for the process.

las razones para utilizar esto pueden ser:

  1. tienes un montón de tales parámetros Mandatory=$true y el costo es alto para convertir todos ellos.
  2. La secuencia de comandos se utilizará de forma interactiva y no interactiva, y cuando se ejecuta de forma interactiva, es posible que se le soliciten parámetros faltantes.
Cuestiones relacionadas