Si llama a aplicaciones nativas, no debe preocuparse por [Environment]::CurrentDirectoryel $PWDdirectorio actual de PowerShell . Por varias razones, PowerShell no establece el directorio de trabajo actual del proceso cuando establece la ubicación o la ubicación de inserción, por lo que debe asegurarse de hacerlo si está ejecutando aplicaciones (o cmdlets) que esperan que se establezca.
En un script, puedes hacer esto:
$CWD = [Environment]::CurrentDirectory
Push-Location $MyInvocation.MyCommand.Path
[Environment]::CurrentDirectory = $PWD
## Your script code calling a native executable
Pop-Location
# Consider whether you really want to set it back:
# What if another runspace has set it in-between calls?
[Environment]::CurrentDirectory = $CWD
No hay alternativa infalible a esto. Muchos de nosotros ponemos una línea en nuestra función de solicitud para establecer [Environment] :: CurrentDirectory ... pero eso no te ayuda cuando cambias la ubicación dentro de un script.
Dos notas sobre el motivo por el cual PowerShell no establece esto automáticamente:
- PowerShell puede ser multiproceso. Puede tener múltiples Runspaces (consulte RunspacePool y el módulo PSThreadJob) ejecutándose simultáneamente en un solo proceso. Cada espacio de ejecución tiene su propio
$PWDdirectorio de trabajo actual, pero solo hay un proceso y solo un entorno.
- Incluso cuando tiene un solo subproceso,
$PWDno siempre es un CurrentDirectory legal (por ejemplo, puede incluir un CD en el proveedor de registro).
Si desea ponerlo en su solicitud (que solo se ejecutaría en el espacio de ejecución principal, de un solo subproceso), debe usar:
[Environment]::CurrentDirectory = Get-Location -PSProvider FileSystem
antcon algunos parámetros. Entonces tengo que llamarantdesde esa carpeta para asegurarme de que encuentre el archivo de configuración correctamente. Idealmente, estoy buscando algo para cambiar temporalmente el directorio de ejecución localmente dentro de ese script.