PowerShell: Manipulação de erro do novo PSDrive

1

Eu tenho um script onde montei com o comando "New-PSDrive", uma unidade de rede. Agora, como o script está sendo executado como um "cronjob" em um servidor, quero ter alguma detecção de erro. Se por algum motivo o comando New-PSDrive falhar, o script deve parar de executar e notificar que algo deu errado. Eu tenho o seguinte código:

Try {
    New-PSDrive -Name A -PSProvider FileSystem -Root \server\share
} Catch {
    ... handle error case ...
}
... other code ...

Por razões de teste, eu especifiquei um nome de servidor incorreto e recebi o seguinte erro "New-PSDrive: Raiz da unidade" \ wrongserver \ share "não existe ou não é uma pasta". Qual é o OK desde que o servidor não existe. Mas o script não entra na cláusula Catch e pára. Felizmente continua a correr e acaba em uma confusão desde que nenhuma unidade está montada: -)

Então, minha pergunta, por quê? Existe alguma diferença no tratamento de exceções no PowerShell? Também devo observar que sou um noob no script do PowerShell.

Tchau, Martin

    
por mazebuhu 25.02.2011 / 15:18

2 respostas

2

Existem dois tipos de erros no Powershell, encerrando erros e erros não terminados. Confira a ajuda de about_try_catch_finally para mais informações.

Se eu tentar isso

try
{
jimjim-cmdlet
}
catch
{
"It's a jimjim error!"
}

o cmdlet nonsense gerará um erro de finalização que será capturado pelo bloco catch.

O código que você está executando não está lançando um erro de finalização, então a execução lança o erro de não finalização e continua após o bloco catch.

Veja também esta página, link , para obter mais informações.

Ainda estou um pouco confuso quando exatamente um erro de finalização é lançado, em oposição a um erro que não termina (talvez mais pessoas que tenham conhecimento possam ajudar).

    
por 25.02.2011 / 17:01
2

Eu sei que estou atrasado para a festa, mas aqui está minha opinião sobre isso.

Para erros que não terminam, você pode ler a variável de erro no índice 0 da mesma forma

try {    
   New-PSDrive -Name "H" -PSProvider filesystem -Root \SERVER\Folder -Scope 1
if ($Error[0].Exception.Message -like "*does not exist*")
{
   throw [System.IO.FileNotFoundException]::new("Could not find folder")
}
}
Catch [System.IO.FileNotFoundException]
{
    break
}
Catch 
{
    # Other error handling
}

Isso deve quebrar seu script, você pode adicionar lógica adicional e fazer o login no bloco catch.

    
por 23.05.2017 / 13:02

Tags