Llame al script de PowerShell PS1 desde otro script de PS1 dentro de Powershell ISE
Quiero ejecutar una llamada para un script myScript1.ps1 dentro de un segundo script myScript2.ps1 dentro de Powershell ISE.
El siguiente código dentro de MyScript2.ps1 funciona bien desde la administración de Powershell, pero no funciona dentro de PowerShell ISE:
#Call myScript1 from myScript2
invoke-expression -Command .\myScript1.ps1
Obtengo el siguiente error cuando ejecuto MyScript2.ps1 desde PowerShell ISE:
El término '.\myScript1.ps1' no se reconoce como el nombre de un cmdlet, función, archivo de script o programa ejecutable. Verifique la ortografía del nombre o, si se incluyó una ruta, verifique que la ruta sea correcta e inténtelo nuevamente.
Para ejecutar un script en el mismo directorio.
En PowerShell 3.0 y posteriores puedes usar la variable automática $PSScriptRoot
:
$PSScriptRoot/myScript1.ps1
En PowerShell 1.0 y 2.0 debes usar esta propiedad específica:
& "$(Split-Path $MyInvocation.MyCommand.Path)/myScript1.ps1"
La razón por la que deberías usar eso y nada más se puede ilustrar con este script de ejemplo.
## ScriptTest.ps1
Write-Host "InvocationName:" $MyInvocation.InvocationName
Write-Host "Path:" $MyInvocation.MyCommand.Path
Aquí hay algunos resultados.
PS C:\Usuarios\JasonAr> .\ScriptTest.ps1 Nombre de invocación: .\ScriptTest.ps1 Ruta: C:\Users\JasonAr\ScriptTest.ps1 PS C:\Usuarios\JasonAr> . .\ScriptTest.ps1 Nombre de invocación: . Ruta: C:\Users\JasonAr\ScriptTest.ps1 PS C:\Usuarios\JasonAr> & ".\ScriptTest.ps1" Nombre de invocación: & Ruta: C:\Users\JasonAr\ScriptTest.ps1
En PowerShell 3.0 y posteriores puedes usar la variable automática $PSScriptRoot
:
## ScriptTest.ps1
Write-Host "Script:" $PSCommandPath
Write-Host "Path:" $PSScriptRoot
PS C:\Users\jarcher> .\ScriptTest.ps1 Guión: C:\Users\jarcher\ScriptTest.ps1 Ruta: C:\Usuarios\jarcher
Estoy llamando a myScript1.ps1 desde myScript2.ps1.
Suponiendo que ambos scripts están en la misma ubicación, primero obtenga la ubicación del script usando este comando:
$PSScriptRoot
Y luego, agregue el nombre del script al que desea llamar de esta manera:
& "$PSScriptRoot\myScript1.ps1"
Esto debería funcionar.