usar tutorial script como commands comandos powershell

script - powershell tutorial



PowerShell: comando de ejecuciĆ³n desde el directorio de scripts (6)

Tengo un script de PowerShell que hace algunas cosas usando el directorio actual del script. Entonces, cuando está dentro de ese directorio, ejecutar ./script.ps1 funciona correctamente.

Ahora quiero llamar a ese script desde un directorio diferente sin cambiar el directorio de referencia del script. Así que quiero llamar a ../../dir/script.ps1 y aún quiero que esa secuencia de comandos 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?


¿Quiere decir que quiere la ruta del script para que pueda hacer referencia a un archivo al lado del script? Prueba esto:

$scriptpath = $MyInvocation.MyCommand.Path $dir = Split-Path $scriptpath Write-host "My directory is $dir"

Puede obtener mucha información de $ MyInvocation y sus propiedades.

Si desea hacer referencia a un archivo en el directorio de trabajo actual, puede usar Resolve-Path o Get-ChildItem:

$filepath = Resolve-Path "somefile.txt"

EDITAR (basado en el comentario de OP):

# temporarily change to the correct folder Push-Location $folder # do stuff, call ant, etc # now back to previous directory Pop-Location

Probablemente haya otras maneras de lograr algo similar usando Invoke-Command también.


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

$ currentPath = Split-Path ((Get-Variable MyInvocation -Scope 0) .Value) .MyCommand.Path

módulo de importación "$ currentPath / sqlps.ps1"


Bueno, estaba 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 cual desea ejecutar el script (lo importante es que tiene tabulaciones)

    ../../dir

  • Ahora rodee la ubicación con comillas dobles, y dentro de ellas agregue cd , para que podamos invocar otra instancia de powershell.

    "cd ../../dir"

  • Agregue otro comando para ejecutar el script separado por ; , con es un separador de comandos en powershell

    "cd ../../dir/; script.ps1"

  • Finalmente ejecútalo con otra instancia de powershell

    start powershell "cd../../dir/; script.ps1"

Esto abrirá una nueva ventana de powershell, vaya a ../../dir , ejecute script.ps1 y cierre la ventana.

Tenga en cuenta que ";" simplemente separa los comandos, como los tipeó uno por uno, si falla primero se ejecutará el segundo y el siguiente después, 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 tabulaciones (no se pueden hacer comillas dobles).

start powershell "-noexit cd../../dir/; script.ps1"

Use comillas dobles "" para poder pasar directorios con espacios en los nombres, por ejemplo,

start powershell "-noexit cd ''../../my dir''; script.ps1"


Esto funcionaría bien.

Push-Location $PSScriptRoot Write-Host CurrentDirectory $CurDir


Hay respuestas con gran cantidad de votos, pero cuando leí tu pregunta, pensé que querías saber el directorio donde está el script, no el lugar donde se ejecuta el script. Puede obtener la información con las variables automáticas de powershell

$PSScriptRoot - the directory where the script exists, not the target directory the script is running in $PSCommandPath - the full path of the script

Por ejemplo, tengo el script $ profile que encuentra el archivo de la solución 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.


Si llama a aplicaciones nativas, debe preocuparse por [Environment]::CurrentDirectory no sobre el directorio actual $PWD PowerShell. Por alguna razón que se me escapa, PowerShell no establece el directorio de trabajo actual del proceso cuando establece Set-Location o Push-Location , por lo que debe asegurarse de hacerlo si está ejecutando aplicaciones (o cmdlets) que esperan que funcione. ser establecido.

En un script, puedes hacer esto:

Push-Location $MyInvocation.MyCommand.Path [Environment]::CurrentDirectory = $PWD ## Your Script Code ... Pop-Location [Environment]::CurrentDirectory = $PWD

No hay una alternativa infalible a esto. Muchos de nosotros ponemos una línea en nuestra función rápida para establecer [Entorno] :: Directorioactual ... pero eso no lo ayuda cuando está cambiando la ubicación en un script.

Nota final: $PWD no siempre es un CurrentDirectory legal (puede incluir un CD en el proveedor de registro, por ejemplo), así que si desea poner esto en su prompt, o en las funciones de contenedor para los cmdlets * -Location, debe usar :

[Environment]::CurrentDirectory = Get-Location -PSProvider FileSystem