Compartilhar via


Powershell Teste e Confirmação de execução ( Whatif / Confirm )

Introdução

*No powershell alguns cmdlets possuem dois parâmetros chamados WhatIf e Confirm, que nos possibilitam testarmos os comandos sem efetivamente executá-los e solicitar confirmação antes de cada ação, quando esses parâmetros estão presentes ao invés de executar as ações os cmdlets vão retornar informações sobre o que estaria sendo feito com cada um dos objeto.

Também vamos abordar uma forma de simular a execução do WhatIf e Confirm para os cmdlets que não possuem suporte a eles.

*

Teste de Execução – WhatIf

Digamos que você está testando aquele comando novo ou está elaborando uma sequencia de filtros que no final executara uma ação nos objetos resultantes, bem provavelmente você vai querer testar isso antes de executar ( se sua resposta é não testar, boa sorte :D ), o parâmetro WhatIf nos permite efetuar um teste simples que vai nos descrever as ações tomadas para cada um dos objetos, temos então um exemplo, queremos matar todos processos com N no nome.

Stop-Process -Name “N*” -WhatIf

Ele não executou a ação ele somente me informou que estaria executando o cmdlet Stop-Process no objeto Notepad.
Isso funciona também após um redirecionamento de pipeline.

Get-Process “S*” | Stop-Process -WhatIf
**
**

Nesse exemplo não faz muito sentido o whatif, porém vamos imaginar um ambiente no qual você vai remover usuários do Active Directory ou Deletar as Databases do Exchange...

Lembrando que nem todos os cmdlets possuem suporte ao parâmetro -Whatif, mas você pode facilmente improvisar uma maneira similar.

Get-Process “S*” | Foreach-Object{Write-Host “Estaria executando Stop-Process no objeto $_” }
**
**

Dependo da situação talvez seja necessário especificar qual propriedade do objeto o nosso Write-Host deve exibir, pois caso contrario ele vai mostrar só o nome do tipo de objeto, nesse caso devemos mover a variável $_ para fora das aspas.

Get-Process “S*” | Foreach-Object{Write-Host “Estaria executando Stop-Process no objeto “$_.Name }
**
**

Confirmação de Execução ( Confirm )

Esse parâmetro faz com que o cmdlet nos solicite aprovação para cada uma das ações que vão ser executadas, por exemplo queremos matar o processo Notepad, mas sem correr risco de matar os outros (exemplo vamos imaginar que não temos como filtrar propriedades do objeto)

Stop-Process Notepad -Confirm

No caso de estarmos passando objetos via pipeline, o funcionamento é o mesmo.

Caso o cmdlet que queiramos executar não possua esse parâmetros podemos reproduzir sua função da seguinte forma.

Get-Process “S*” | Foreach-Object { $Confirm = Read-Host “Você quer executar STOP-PROCESS no processo” $_.Name ;
** Switch ($Confirm) {
“Y” {Stop-Process $_ } ;
“N” {}
}
}**

Ou você pode utilizar essa função em seus script e chamá-la após o pipeline.

Function Confirm-Command {
**
 <#
.SYNOPSIS
Função utilizada para simular a mesma ação do parâmetros -Confirm
.DESCRIPTION
Essa função recebe 2 parâmetros um o comando a ser executado e outro a lista de objetos na qual vamos executar o comando
.EXAMPLE
Get-Process -Name Notepad | Confirm-Command -Command “Stop-Process”
.PARAMETER Command
recebe o comando que você quer executar em formato de string.
#>

[CmdletBinding()]
param(
[Parameter(Mandatory=$True,ValueFromPipeline=$false)]
[string]$Command,**

**[Parameter(Mandatory=$True,ValueFromPipeline=$true)]
$Targets
)
BEGIN {
$All = $Null
}
PROCESS {
ForEach( $Target in $Targets ){
switch ($All){
0 { & $Command $Target }
1 { exit }
Default{
$Confirm = Read-Host "Você quer mesmo executar "$Command "no alvo "$Target "? `n[S]im, [N]ão, [ST] Sim para todos, [NT] Não para todos "
switch ($Confirm){
"S" {& $Command $Target}
"N" {}
"ST" {$All = 0}
"NT" {$All = 1}
default {}
}
}
}
}
}
END {
}
}
Get-Process -Name Notepad | Confirm-Command -Command “Stop-Process”
**

Então chegamos ao fim de mais um artigo, espero que esse artigo ajude vocês em seus ambientes.

Referencias

Esses artigos serviram como fonte de consulta durante a criação deste ou possuem mais informações relevantes.

Este artigo foi originalmente escrito por:
Matheus Kamphorst
blog: http://howtoserver.com

https://c.statcounter.com/8402705/0/5340871c/1/