Quiero ejecutar la 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 Powershell Administration, pero no funciona dentro de PowerShell ISE:
#Call myScript1 from myScript2
invoke-expression -Command .\myScript1.ps1
Obtengo el siguiente error cuando ejecuto MyScript2.ps1 de 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 e intente nuevamente.
fuente
La ruta actual de MyScript1.ps1 no es la misma que myScript2.ps1. Puede obtener la ruta de la carpeta de MyScript2.ps1 y concatenarla a MyScript1.ps1 y luego ejecutarla. Ambas secuencias de comandos deben estar en la misma ubicación.
fuente
Estoy llamando 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 utilizando este comando:
Y, luego, agregue el nombre del script que desea llamar así:
Esto debería funcionar.
fuente
& "$PSScriptRoot\myScript1.ps1"
es suficienteSolución de una línea:
fuente
& '.\MyScript1.ps'
si el script reside en el mismo directorio?Esto es solo información adicional a las respuestas para pasar argumentos al otro archivo
Donde esperas discusión
PrintName.ps1
Cómo llamar al archivo
Si no proporciona ninguna entrada, el valor predeterminado será "Joe" y se pasará como argumento al argumento printName en el archivo PrintName.ps1 que a su vez imprimirá la cadena "Joe"
fuente
Es posible que ya haya encontrado la respuesta, pero esto es lo que hago.
Normalmente coloco esta línea al comienzo de mis scripts de instalación:
Entonces puedo usar la variable $ PSScriptRoot como una ubicación del script actual (ruta), como en el siguiente ejemplo:
En su caso, puede reemplazar
Inicio-proceso ... 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
fuente
Para ejecutar fácilmente un archivo de script en la misma carpeta (o subcarpeta de) que la persona que llama, puede usar esto:
fuente
Tuve un problema con esto. Sin embargo, no utilicé ninguna
$MyInvocation
cosa inteligente para solucionarlo. Si abre el ISE haciendo clic derecho en un archivo de script y seleccionando yedit
luego abre el segundo script desde el ISE, puede invocar uno desde el otro simplemente usando la sintaxis normal . \ Script.ps1 . Mi conjetura es que el ISE tiene la noción de una carpeta actual y abrirla así establece la carpeta actual en la carpeta que contiene los scripts. Cuando invoco un script de otro en uso normal, solo uso . \ Script.ps1 , en mi opinión, es incorrecto modificar el script solo para que funcione correctamente en el ISE ...fuente
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 particular en la misma raíz, necesito llamar a la carpeta de script particular (que llama al script general con el parámetro del problema particular). Entonces el directorio de trabajo es así
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
Y el código dentro de Solution1.PS1 es:
fuente
Presento mi ejemplo para su consideración. Así es como llamo un código de un script de controlador en las herramientas que hago. Los scripts que hacen el trabajo también necesitan aceptar parámetros, por lo que este ejemplo muestra cómo pasarlos. Asume que el script que se llama está en el mismo directorio que el script del controlador (script que realiza la llamada).
Lo anterior es un script de controlador que acepta 3 parámetros. Estos se definen en el bloque param. El script del controlador luego llama al script llamado Get-ZAEventLogData.ps1. Por el bien de ejemplo, este script también acepta los mismos 3 parámetros. Cuando el script del controlador llama al script que hace el trabajo, debe llamarlo y pasar los parámetros. Lo anterior muestra cómo lo hago salpicando.
fuente
¿Cómo ejecuta los scripts integrados de PowerShell dentro de sus scripts?
¿Cómo se utilizan los scripts integrados como
Esos son ejecutados por su computadora, verificando automáticamente la ruta del script.
Del mismo modo, puedo ejecutar mis scripts personalizados simplemente poniendo el nombre del script en el bloque de script
Vaya a la línea de comandos de PowerShell y escriba
Esto devolverá la ruta a un archivo que nuestra línea de comandos de PowerShell ejecutará cada vez que abra la aplicación.
Se verá así
Vaya a Documentos y vea si ya tiene un directorio WindowsPowerShell. No lo hice
Ahora hemos creado el script que se lanzará cada vez que abramos la aplicación PowerShell.
La razón por la que lo hicimos fue para poder agregar nuestra propia carpeta que contiene todos nuestros scripts personalizados. Creemos esa carpeta y la llamaré "Bin" después de los directorios en los que Mac / Linux contiene sus scripts.
Ahora queremos que ese directorio se agregue a nuestra
$env:path
variable cada vez que abramos la aplicación, así que regrese alWindowsPowerShell
Directorio yLuego agrega esto
Ahora el shell encontrará automáticamente sus comandos, siempre que guarde sus scripts en ese directorio "Bin".
Vuelva a iniciar el PowerShell y debería ser uno de los primeros scripts que se ejecutan.
Ejecute esto en la línea de comando después de volver a cargar para ver su nuevo directorio en su variable de ruta:
Ahora podemos llamar a nuestros scripts desde la línea de comandos o desde otro script de la siguiente manera:
Como puede ver, debemos llamarlos con la
.ps1
extensión hasta que creemos alias para ellos. Si queremos ponernos elegantes.fuente