224 votes

Appeler PowerShell script PS1 à partir d'un autre PS1 script à l'intérieur de Powershell ISE

Je veux l'exécution d'un appel pour un myScript1.ps1 script à l'intérieur d'un second myScript2.ps1 script à l'intérieur de Powershell ISE.

Le code suivant dans MyScript2.ps1, fonctionne bien depuis l'administration Powershell, mais ne fonctionne pas dans PowerShell ISE :

#Call myScript1 from myScript2
invoke-expression -Command .\myScript1.ps1

J'obtiens l'erreur suivante lorsque j'exécute MyScript2.ps1 à partir de PowerShell ISE :

Le terme ". \myScript1.ps1 ' n'est pas reconnu comme le nom d'un cmdlet, d'une fonction, d'un fichier script ou d'un programme exploitable. Vérifiez l'orthographe du nom, ou si un chemin d'accès a été inclus, vérifiez que le chemin d'accès est correct et réessayez.

117voto

JasonMArcher Points 4662

Afin de trouver l'emplacement d'un script, utilisez Split-Path $MyInvocation.MyCommand.Path (assurez-vous de l'utiliser dans le contexte script).

La raison pour laquelle vous devriez utiliser cela et pas autre chose peut être illustrée avec cet exemple script.

## ScriptTest.ps1
Write-Host "InvocationName:" $MyInvocation.InvocationName
Write-Host "Path:" $MyInvocation.MyCommand.Path

Voici quelques résultats.

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 et plus tard, vous pouvez utiliser la variable automatique $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

102voto

Srijani Points 57

J'appelle myScript1.ps1 depuis myScript2.ps1 .

En supposant que les deux script sont au même endroit, obtenez d'abord l'emplacement du script en utilisant cette commande :

$PSScriptRoot

Et, ensuite, ajoutez le nom du script que vous voulez appeler comme ceci :

& "$PSScriptRoot\myScript1.ps1"

Cela devrait fonctionner.

45voto

Shay Levy Points 41404

Le chemin actuel de MyScript1.ps1 n'est pas le même que celui de myScript2.ps1. Vous pouvez obtenir le chemin de dossier de MyScript2.ps1 et le concaténer à MyScript1.ps1, puis l'exécuter. Les deux scripts doivent se trouver au même endroit.

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

23voto

noelicus Points 3788

Solution en une seule ligne :

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

18voto

cpoDesign Points 1996

Il s'agit juste d'informations supplémentaires pour répondre aux questions afin de passer l'argument dans un autre fichier

Où vous attendez l'argument

Nom d'impression.ps1

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

Write-Host $printName

Comment appeler le fichier

Param(
    [Parameter( Mandatory = $false)]
    $name = "Joe"    
)

& ((Split-Path $MyInvocation.InvocationName) + "\PrintName.ps1") -printName $name

Si vous ne fournissez pas d'entrée, la valeur par défaut sera "Joe" et celle-ci sera transmise comme argument dans l'argument printName de la commande Nom d'impression.ps1 fichier qui, à son tour, imprimera le "Joe" cadena

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X