Existe uma maneira de suprimir quaisquer prompts interativos em um script do PowerShell?

11

Ao escrever scripts do PowerShell, percebi que, quando determinados cmdlets encontram problemas, eles exibem um prompt interativo, e Remove-Item em um diretório não vazio é um exemplo. Isso é mortal ao tentar automatizar tarefas, prefiro que a ação simplesmente falhe e lance uma exceção ou retorne um código de retorno inválido para que o script inteiro não fique bloqueado aguardando uma resposta.

Existe alguma maneira de forçar o PowerShell a falhar automaticamente, em vez de buscar a entrada do usuário nas ações?

    
por Chuu 24.03.2013 / 08:45

5 respostas

4

A solução proposta por Eris inicia efetivamente outra instância do PowerShell. Uma maneira alternativa de fazer isso, com uma sintaxe mais simples, é desembolsar para outra instância do powershell.exe.

powershell.exe -NonInteractive -Command "Remove-Item 'D:\Temp\t'"
    
por 06.10.2015 / 14:33
3

Veja Get-Help about_Preference_Variables :

$ConfirmPreference
------------------
    Determines whether Windows PowerShell automatically prompts you for
    confirmation before running a cmdlet or function.

...

None:    Windows PowerShell does not prompt automatically.
                         To request confirmation of a particular command, use
                         the Confirm parameter of the cmdlet or function.

Então:

> $ConfirmPreference = 'None'
    
por 25.03.2013 / 16:12
1

Ok, isso é realmente feio, mas as manchas sagradas de mostarda "funcionam".

Problemas:

  • Eu não descobri como continuar após o primeiro erro
  • Nesse caso, ele remove arquivos simples e, em seguida, para na primeira pasta
  • Eu não descobri como fazer esse cmdlet funcionar se eu adicionar o parâmetro UseTransaction
  • Isso só funcionará para o caso Simples (comandos que não fazem muita coisa com o ambiente atual). Eu não testei nada complexo

    $MyPS = [Powershell]::Create() em $MyPS.Commands.AddCommand("Remove-Item") em $MyPS.Commands.AddParameter("Path", "D:\Temp\t") em $MyPS.Invoke()

Saída:

Commands                                                                                                                 
--------                                                                                                                 
{Remove-Item}                                                                                                            
{Remove-Item}                                                                                                            
Exception calling "Invoke" with "0" argument(s): "A command that prompts the user failed because the host program or the 
command type does not support user interaction. The host was attempting to request confirmation with the following 
message: The item at D:\Temp\t has children and the Recurse parameter was not specified. If you continue, all children 
will be removed with the item. Are you sure you want to continue?"
At line:19 char:1
+ $MyPS.Invoke()
+ ~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : CmdletInvocationException
    
por 19.07.2013 / 07:29
0

Todas as soluções acima falharam para mim quando criei um diretório, o que significa que fui solicitado a clicar em OK em todos os diretórios criados pelo meu script - o que foi muito. O que funcionou para mim foi apegar | Out-null para canalizar os resultados para Out-Null

New-Item -ItemType Directory -Path $directory -Force:$true | Out-Null

Observe que $ Directory é uma string com o caminho completo para o diretório que você deseja criar. Espero que isso economize alguém algum tempo: P

    
por 02.10.2018 / 23:09
-1

Eu sugiro duas técnicas

a) Anexar -force

b) Anexar -errorAction silently continue

É assim que pesquiso quais cmdlets suportam um determinado parâmetro

Get-Command | where { $_.parameters.keys -contains "erroraction"}
    
por 24.03.2013 / 09:25

Tags