Tengo un script de PowerShell que hace algunas cosas usando el directorio actual del script. Entonces, dentro de ese directorio, la ejecución .\script.ps1
funciona correctamente.
Ahora quiero llamar a ese script desde un directorio diferente sin cambiar el directorio de referencia del script. Entonces quiero llamar ..\..\dir\script.ps1
y todavía quiero que ese script se comporte como se llamó desde dentro de su directorio.
¿Cómo hago eso, o cómo modifico un script para que pueda ejecutarse desde cualquier directorio?
fuente
ant
con algunos parámetros. Entonces tengo que llamarant
desde 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.Push-Location
yPop-Location
Si llama a aplicaciones nativas, no debe preocuparse por
[Environment]::CurrentDirectory
el$PWD
directorio 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:
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:
$PWD
directorio de trabajo actual, pero solo hay un proceso y solo un entorno.$PWD
no 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:
fuente
.\_/.
, ¡porque esto mató la mitad de mi día! ¿Gente en serio? ¿En serio? ..[Environment]::CurrentDirectory
cuando eso difiere de$PWD
. Lo correcto sería almacenarlo en una variable$origEnvDir = [Environment]::CurrentDirectory
y luego restaurarlo[Environment]::CurrentDirectory = $origEnvDir
.Hay respuestas con gran cantidad de votos, pero cuando leí tu pregunta, pensé que querías saber el directorio donde está el script, no aquel donde se está ejecutando el script. Puede obtener la información con las variables automáticas de powershell
Por ejemplo, tengo un script de $ profile que encuentra el archivo de solución de Visual Studio y lo inicia. Quería almacenar la ruta completa, una vez que se inicia un archivo de solución. Pero quería guardar el archivo donde existe el script original. Entonces usé $ PsScriptRoot.
fuente
A menudo utilicé el siguiente código para importar un módulo que se encuentra en el mismo directorio que el script en ejecución. Primero obtendrá el directorio desde el que se ejecuta powershell
fuente
Esto funcionaría bien.
fuente
Pop-Location
al final para devolver la ruta a su estado original.Bueno, estuve buscando una solución para esto por un tiempo, sin ningún script solo de CLI. Así es como lo hago xD:
Navegue a la carpeta desde la que desea ejecutar la secuencia de comandos (lo importante es que tenga las pestañas completadas)
..\..\dir
Ahora rodee la ubicación con comillas dobles, y agregue dentro de ellas
cd
, para que podamos invocar otra instancia de powershell."cd ..\..\dir"
Agregue otro comando para ejecutar el script separado por
;
, con un separador de comandos en powershell"cd ..\..\dir\; script.ps1"
Finalmente ejecutarlo con otra instancia de powershell
start powershell "cd..\..\dir\; script.ps1"
Esto abrirá una nueva ventana de PowerShell, vaya a
..\..\dir
, ejecutescript.ps1
y cierre la ventana.Tenga en cuenta que ";" simplemente separa los comandos, como los escribió uno por uno, si el primero falla, el segundo se ejecutará y luego el siguiente, y el siguiente después ... Si desea mantener abierta la nueva ventana de PowerShell, agregue -noexit en el comando pasado. Tenga en cuenta que primero navego a la carpeta deseada para poder usar las finalizaciones de tabulación (no podría entre comillas dobles).
start powershell "-noexit cd..\..\dir\; script.ps1"
Utilice comillas dobles
""
para poder pasar directorios con espacios en los nombres, por ejemplo,start powershell "-noexit cd '..\..\my dir'; script.ps1"
fuente
Hice una frase con la solución de @ JohnL:
fuente