wake-up-neo.net

Rufen Sie das PowerShell-Skript PS1 aus einem anderen PS1-Skript in Powershell ISE auf

Ich möchte die Aufrufausführung für ein Skript myScript1.ps1 in einem zweiten Skript myScript2.ps1 in Powershell ISE.

Der folgende Code in MyScript2.ps1 funktioniert gut mit der Powershell-Verwaltung, funktioniert jedoch nicht in PowerShell ISE:

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

Beim Ausführen von MyScript2.ps1 von PowerShell ISE erhalte ich die folgende Fehlermeldung:

Der Begriff '.\MyScript1.ps1' wird nicht als Name eines Cmdlets, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens oder überprüfen Sie, ob der Pfad korrekt ist, und versuchen Sie es erneut.

99
Nicola Celiento

Um den Speicherort eines Skripts zu ermitteln, verwenden Sie Split-Path $MyInvocation.MyCommand.Path (stellen Sie sicher, dass Sie dies im Skriptkontext verwenden).

Der Grund, warum Sie das verwenden sollten und nichts anderes kann mit diesem Beispielskript veranschaulicht werden.

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

Hier sind einige Ergebnisse.

 PS C:\Users\JasonAr>.\ScriptTest.ps1 
 InvocationName:.\ScriptTest.ps1 
 Pfad: C:\Users\JasonAr\ScriptTest.ps1 

 PS C:\Benutzer\JasonAr>. .\ScriptTest.ps1 
 InvocationName: .
 Pfad: C:\Users\JasonAr\ScriptTest.ps1 

 PS C:\Users\JasonAr> & ".\ScriptTest.ps1" 
InvocationName: & 
 Pfad: C:\Users\JasonAr\ScriptTest.ps1 

In PowerShell 3.0 und später können Sie die automatische Variable $PSScriptRoot verwenden:

## ScriptTest.ps1
Write-Host "Script:" $PSCommandPath
Write-Host "Path:" $PSScriptRoot
 PS C:\Users\jarcher>.\ScriptTest.ps1 
 Script: C:\Users\jarcher\ScriptTest.ps1 
 Pfad: C:\Users\jarcher 
68
JasonMArcher

Der aktuelle Pfad von MyScript1.ps1 stimmt nicht mit myScript2.ps1 überein. Sie können den Ordnerpfad von MyScript2.ps1 abrufen und mit MyScript1.ps1 verketten und dann ausführen. Beide Skripts müssen sich am selben Ort befinden.

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

Einzeilige Lösung:

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

Ich rufe myScript1.ps1 von myScript2.ps1 auf.

Nehmen Sie an, beide Skripte befinden sich am selben Ort. Rufen Sie zunächst den Speicherort des Skripts mit dem folgenden Befehl ab:

$PSScriptRoot

Hängen Sie dann den Skriptnamen, den Sie aufrufen möchten, wie folgt an:

& "$PSScriptRoot\myScript1.ps1"

Das sollte funktionieren.

10
Srijani Ghosh

Dies ist nur eine Zusatzinformation zu answers, um Argumente in eine andere Datei zu übergeben 

Wo erwarten Sie Argumente?

PrintName.ps1

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


Write-Host $printName

So rufen Sie die Datei auf 

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


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

Wenn Sie keine Eingaben machen, wird standardmäßig "Joe" verwendet, und dies wird als Argument in das Argument printName in PrintName.ps1 file Übergeben, das wiederum das "Joe" string

4
cpoDesign

Sie haben vielleicht schon die Antwort darauf gefunden, aber ich mache es hier. 

Normalerweise füge ich diese Zeile am Anfang meiner Installationsskripte ein:

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

Dann kann ich die Variable $ PSScriptRoot als Speicherort des aktuellen Skripts (Pfad) verwenden, wie im folgenden Beispiel: 

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)

In Ihrem Fall können Sie ersetzen 

Start-Prozess ... Zeile mit 

Invoke-Expression $ PSScriptRoot\ScriptName.ps1

Weitere Informationen zu den automatischen Variablen $ MYINVOCATION und $ PSScriptRoot finden Sie auf der Microsoft-Website: https://msdn.Microsoft.com/en-us/powershell/reference/5.1/Microsoft.powershell.core/about/about_automatic_variables

4

Zur einfachen Ausführung einer Skriptdatei in demselben Ordner (oder Unterordner) des Anrufers können Sie Folgendes verwenden:

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

# Execute script at location:
&"$ScriptRoute"
3
Rrr

Ich hatte ein Problem damit. Ich habe kein kluges $MyInvocation-Zeug benutzt, um das Problem zu beheben. Wenn Sie die ISE öffnen, indem Sie mit der rechten Maustaste auf eine Skriptdatei klicken und edit auswählen, dann das zweite Skript in der ISE öffnen, können Sie eines mit der normalen.\Script.ps1 syntax . My aufrufen Vermutung ist, dass die ISE die Vorstellung eines aktuellen Ordners hat und beim Öffnen so den aktuellen Ordner auf den Ordner setzt, der die Skripte enthält .. Wenn ich ein Skript von einem anderen in normaler Verwendung aufrufe, verwende ich einfach.\script. ps1 , IMO, es ist falsch, das Skript zu modifizieren, damit es in der ISE richtig funktioniert ...

3
Sabroni

Ich hatte ein ähnliches Problem und habe es so gelöst.

Mein Arbeitsverzeichnis ist ein allgemeiner Skriptordner und mehrere bestimmte Skriptordner im gleichen Stammverzeichnis. Ich muss einen bestimmten Skriptordner aufrufen (der allgemeine Skripts mit den Parametern des jeweiligen Problems aufruft) .. _. Das Arbeitsverzeichnis ist also so

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

Solutions1 und Solutions2 rufen den PS1-Ordner "Scripts" auf, wobei der in ParameterForSolution ..__ gespeicherte Parameter geladen wird. In Powershell ISE führe ich diesen Befehl aus

.\Nico\Problem1\Solution1.PS1

Und der Code in Solution1.PS1 lautet:

# 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"
1
Nico Osorio

Wie führen Sie in Ihre Skripts integrierte PowerShell-Skripts aus? 

Wie verwenden Sie integrierte Skripte wie 

Get-Location
pwd
ls
dir
split-path
::etc...

Diese werden von Ihrem Computer ausgeführt und prüfen automatisch den Pfad des Skripts.

In ähnlicher Weise kann ich meine benutzerdefinierten Skripts ausführen, indem Sie einfach den Namen des Skripts in den Skriptblock eingeben

::sid.ps1 is a PS script I made to find the SID of any user
::it takes one argument, that argument would be the username
echo $(sid.ps1 jowers)


(returns something like)> S-X-X-XXXXXXXX-XXXXXXXXXX-XXX-XXXX


$(sid.ps1 jowers).Replace("S","X")

(returns same as above but with X instead of S)

Gehen Sie zur Powershell-Befehlszeile und geben Sie ein

> $profile

Dadurch wird der Pfad zu einer Datei zurückgegeben, die von unserer PowerShell-Befehlszeile jedes Mal ausgeführt wird, wenn Sie die App öffnen.

Es wird so aussehen 

C:\Users\jowers\OneDrive\Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1

Wechseln Sie zu Dokumente und prüfen Sie, ob Sie bereits ein WindowsPowerShell-Verzeichnis haben. Ich habe es nicht getan 

> cd \Users\jowers\Documents
> mkdir WindowsPowerShell
> cd WindowsPowerShell
> type file > Microsoft.PowerShellISE_profile.ps1

Wir haben jetzt ein Skript erstellt, das jedes Mal gestartet wird, wenn wir die PowerShell App öffnen.

Der Grund dafür war, dass wir unseren eigenen Ordner hinzufügen konnten, der alle unsere benutzerdefinierten Skripts enthält. Lassen Sie uns diesen Ordner erstellen und ich benenne ihn nach den Verzeichnissen, in denen Mac/Linux seine Skripte hält, "Bin".

> mkdir \Users\jowers\Bin

Jetzt möchten wir, dass dieses Verzeichnis jedes Mal, wenn wir die App öffnen, zu unserer Variablen $env:path hinzugefügt wird. Gehen Sie also zurück in das Verzeichnis WindowsPowerShell und

> start Microsoft.PowerShellISE_profile.ps1

Dann füge das hinzu

$env:path += ";\Users\jowers\Bin"

Jetzt findet die Shell Ihre Befehle automatisch, solange Sie Ihre Skripte in diesem "Bin" -Verzeichnis speichern.

Starten Sie die Powershell erneut und es sollte eines der ersten Skripts sein, die ausgeführt werden.

Führen Sie dies nach dem Neuladen in der Befehlszeile aus, um Ihr neues Verzeichnis in Ihrer Pfadvariablen anzuzeigen:

> $env:Path

Jetzt können wir unsere Skripte von der Kommandozeile oder von einem anderen Skript aus so einfach aufrufen:

$(customScript.ps1 arg1 arg2 ...)

Wie Sie sehen, müssen wir sie mit der Erweiterung .ps1 aufrufen, bis wir Aliasnamen für sie erstellen. Wenn wir Lust haben wollen.

0