what started start scripts open how getting activar powershell

started - powershell scripts



Llamar al script PS1 de PowerShell desde otro script PS1 dentro de Powershell ISE (9)

Es posible que ya hayas encontrado la respuesta, pero esto es lo que hago.

Normalmente coloco esta línea al comienzo de mis scripts de instalación:

if(!$PSScriptRoot){ $PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent } #In case if $PSScriptRoot is empty (version of powershell V.2).

Entonces puedo usar la variable $ PSScriptRoot como una ubicación de la secuencia de comandos actual (ruta), como en el siguiente ejemplo:

if(!$PSScriptRoot){ $PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent } #In case if $PSScriptRoot is empty (version of powershell V.2). Try { If (Test-Path ''C:/Program Files (x86)'') { $ChromeInstallArgs= "/i", "$PSScriptRoot/googlechromestandaloneenterprise64_v.57.0.2987.110.msi", "/q", "/norestart", "/L*v `"C:/Windows/Logs/Google_Chrome_57.0.2987.110_Install_x64.log`"" Start-Process -FilePath msiexec -ArgumentList $ChromeInstallArgs -Wait -ErrorAction Stop $Result= [System.Environment]::ExitCode } Else { $ChromeInstallArgs= "/i", "$PSScriptRoot/googlechromestandaloneenterprise_v.57.0.2987.110.msi", "/q", "/norestart", "/L*v `"C:/Windows/Logs/Google_Chrome_57.0.2987.110_Install_x86.log`"" Start-Process -FilePath msiexec -ArgumentList $ChromeInstallArgs -Wait -ErrorAction Stop $Result= [System.Environment]::ExitCode } } ### End Try block Catch { $Result = [System.Environment]::Exitcode [System.Environment]::Exit($Result) } [System.Environment]::Exit($Result)

En tu caso, puedes reemplazar

Start-process ... línea con

Invoke-Expression $ PSScriptRoot / ScriptName.ps1

Puede leer más sobre las variables automáticas $ MYINVOCATION y $ PSScriptRoot en el sitio de Microsoft: https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/about/about_automatic_variables

Deseo la ejecución de llamadas para una secuencia de comandos myScript1.ps1 dentro de una segunda secuencia de comandos 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 operable. Verifique la ortografía del nombre, o si se incluyó una ruta, verifique que la ruta sea correcta y vuelva a intentarlo.


Esta es solo información adicional a las respuestas para pasar el argumento al otro archivo

Donde esperas una discusión

PrintName.ps1

Param( [Parameter( Mandatory = $true)] $printName = "Joe" ) Write-Host $printName

Cómo llamar al archivo

Param( [Parameter( Mandatory = $false)] $name = "Joe" ) & ((Split-Path $MyInvocation.InvocationName) + "/PrintName.ps1") -printName $name

Si no proporciona ninguna entrada, se usará "Joe" por defecto y se pasará como argumento al argumento printName en el archivo PrintName.ps1 , que a su vez imprimirá la cadena "Joe"


La ruta actual de MyScript1.ps1 no es lo mismo que myScript2.ps1. Puede obtener la ruta de la carpeta de MyScript2.ps1 y concatenarla a MyScript1.ps1 y luego ejecutarla. Ambos scripts deben estar en la misma ubicación.

## MyScript2.ps1 ## $ScriptPath = Split-Path $MyInvocation.InvocationName & "$ScriptPath/MyScript1.ps1"


Llamo a myScript1.ps1 desde myScript2.ps1.

Suponiendo que ambos guiones están en la misma ubicación, primero obtenga la ubicación del guión usando este comando:

$PSScriptRoot

Y, a continuación, agregue el nombre de secuencia de comandos que desea llamar de esta manera:

& "$PSScriptRoot/myScript1.ps1".

Esto debería funcionar.


Para ejecutar fácilmente un archivo de script en la misma carpeta (o subcarpeta) que la persona que llama, puede usar esto:

# Get full path to the script: $ScriptRoute = [System.IO.Path]::GetFullPath([System.IO.Path]::Combine($PSScriptRoot, "Scriptname.ps1")) # Execute script at location: &"$ScriptRoute"


Para encontrar la ubicación de un script, use Split-Path $MyInvocation.MyCommand.Path (asegúrese de usar esto en el contexto del script).

La razón por la que debe usar eso y no otra cosa 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:/Users/JasonAr> ./ScriptTest.ps1 InvocationName: ./ScriptTest.ps1 Path: C:/Users/JasonAr/ScriptTest.ps1 PS C:/Users/JasonAr> . ./ScriptTest.ps1 InvocationName: . Path: C:/Users/JasonAr/ScriptTest.ps1 PS C:/Users/JasonAr> & "./ScriptTest.ps1" InvocationName: & Path: C:/Users/JasonAr/ScriptTest.ps1

En PowerShell 3.0 y posterior, puede usar la variable automática $PSScriptRoot :

## ScriptTest.ps1 Write-Host "Script:" $PSCommandPath Write-Host "Path:" $PSScriptRoot

PS C:/Users/jarcher> ./ScriptTest.ps1 Script: C:/Users/jarcher/ScriptTest.ps1 Path: C:/Users/jarcher


Solución de una línea:

& ((Split-Path $MyInvocation.InvocationName) + "/MyScript1.ps1")


Tuve un problema con esto Sin embargo, no $MyInvocation ningún elemento inteligente de $MyInvocation para solucionarlo. Si abre el ISE haciendo clic con el botón derecho en un archivo de script y seleccionando edit luego abra el segundo script desde dentro del ISE, puede invocar uno de los otros simplemente usando la sintaxis normal de . / Script.ps1 . Mi suposición es que el ISE tiene la noción de una carpeta actual y al abrirla así, se establece la carpeta actual en la carpeta que contiene las secuencias de comandos. Cuando invoco un script de otro en uso normal, simplemente uso . / Script.ps1 , IMO es incorrecto modificar el script solo para que funcione correctamente en el ISE ...


Tuve un problema similar y lo resolví de esta manera.

Mi directorio de trabajo es una carpeta de script general y una carpeta de script en particular en la misma raíz, necesito llamar a una carpeta de script determinada (que invoca una secuencia de comandos general con el parámetro del problema en particular). Entonces el directorio de trabajo es así

/Nico/Scripts/Script1.ps1 /Script2.ps1 /Problem1/Solution1.ps1 /ParameterForSolution1.config /Problem2/Solution2.ps1 /ParameterForSolution2.config

Solutions1 y Solutions2 llaman a la PS1 en la carpeta Scripts cargando el parámetro almacenado en ParameterForSolution. Entonces en powershell ISE, ejecuto este comando

./Nico/Problem1/Solution1.PS1

Y el código dentro de Solution1.PS1 es:

# This is the path where my script is running $path = split-path -parent $MyInvocation.MyCommand.Definition # Change to root dir cd "$path/../.." $script = "./Script/Script1.PS1" $parametro = "Problem1/ParameterForSolution1.config" # Another set of parameter Script1.PS1 can receive for debuggin porpuose $parametro +='' -verbose'' Invoke-Expression "$script $parametro"