Rutas y errores de PowerShell
Sin embargo, hay otra situación en la que esto puede resultar complicado, y esta es una pregunta que surgió el otro día. ¿Cómo se puede crear una excepción de terminación para una situación de archivo no encontrado?
Por ejemplo, podrías probar un código como este:
Try {
Test-Path Foo:\Bar.txt -ErrorAction Stop
}
Catch {
Write-Warning "I failed"
}
Cuando ejecutas este código, obtendrás Falso. El código del bloque Catch nunca se ejecuta. Esto se debe a que el cmdlet Test-Path escribe un valor booleano (Verdadero/Falso) en la canalización. Si el archivo o la ruta no existe, no es un error. A pesar de. puedes hacerlo uno. Aquí hay una variación del código anterior.
$path = "Foo:\Bar.txt"
Try {
if (-Not (Test-Path $path)) {
Throw "Failed to find the $path"
}
}
Catch {
Write-Warning "I caught an exception"
$_
}
Esto funciona.
Personalmente, usaría una declaración If simple. Pero obviamente no puedo hablar de los casos de uso de todos.
Pero quizás en lugar de utilizar Test-Path podría considerar un cmdlet diferente.
$path = "Foo:\Bar.txt"
Try {
Resolve-Path -Path $path -ErrorAction Stop
}
Catch {
Write-Warning "I caught an exception"
$_
}
Resolve-Path está destinado a resolver caracteres comodín en una ruta. Si la ruta no existe, el cmdlet generará una excepción. En mi bloque Try/Catch estoy obligando a que termine.
Por cierto, también puedes usar Convert-Path. Una cosa a tener en cuenta es que estos cmdlets escribirán objetos en la canalización, que pueden ser exactamente lo que necesita. Es posible que necesite convertir o resolver una ruta en una verdadera ruta del sistema de archivos, tal vez para ejecutar algún comando que no sea de PowerShell en ella.
$path = "$env:windir\notepad.exe"
Try {
$rPath = Resolve-Path -Path $path -ErrorAction Stop
}
Catch {
Write-Warning "I caught an exception"
$_
}
Write-Host "Using $rPath" -ForegroundColor green
Una opción de archivo es usar Get-Item.
$path = "Foo:\Bar.txt"
Try {
[void](Get-Item -Path $path -ErrorAction Stop)
}
Catch {
Write-Warning "I caught an exception"
$_
}
En este caso, no necesito el objeto de archivo real, por lo que presento los resultados del comando como nada.
No te voy a decir que alguna de estas técnicas sea mejor que la otra. Realmente depende de las necesidades generales de su proyecto de scripting. Le recomiendo que lea la ayuda completa de los cmdlets y ejemplos de los comandos que he mostrado aquí. Puede haber parámetros adicionales que pueden ayudarle a ajustar sus pruebas y manejo de errores.