mayho33
Goto Top

Powershell: Pfad des Scripts finden das ein anderes aufgerufen hast

Hallo @ All!

Ich frage mich momentan wie ich es anstellen muss wenn ich in einem z.B.: "IchWurdeAufgerufen.ps1" den Pfad des Scripts zu erhalten welches "IchWurdeAufgerufen.ps1" ursprünglich aufgerufen hat.
Ich möchte das ohne den Umweg über eine temporäre $env:* lösen und auch kein $arg übergeben.

Sollte doch in Powershell möglich sein irgendwie den Parent eines Child herauszubekommen. Oder liege/denke ich da falsch?

Danke für die Hilfe!

mayho

Content-Key: 237624

Url: https://administrator.de/contentid/237624

Printed on: June 23, 2024 at 08:06 o'clock

Member: colinardo
colinardo May 09, 2014 updated at 11:19:48 (UTC)
Goto Top
Hi mayho,
schau dir mal die Variable $MyInvocation und dessen Eigenschaften an:
$MyInvocation.ScriptName
Ja, ich weiß, es ist mal wieder die nicht lesbare Doku schuld face-smile

Grüße Uwe
Member: mayho33
mayho33 May 11, 2014 at 12:21:45 (UTC)
Goto Top
Hi Uwe!

Ne diesmal ist die Doku kein bisschen schuld. Ich kann da drinnen einfach nicht finden was ich brauche.

$MyInvocation.ScriptName gibt ja nur den Namen des eigenen Scripts wider. Auch die anderen Properties von $MyInvocation liefern nicht das Ergebnis das ich haben will: Den Pfad zu dem Script das als erstes aufgerufen wurde und welches alle anderen Scripts aufruft.

BSP:

StartScript.ps1 >>>ruft<<< GehSchlafen.ps1 >>>ruft<<< PutzDirVorherDieZaehne.ps1 >>>ruft<<< OderDochNochEineRauchen.ps1 >>>ruft<<< PinkelnWaerAuchNichtSchlecht.ps1

PinkelnWaerAuchNichtSchlecht.ps1 möchte nun wisses welches das Script war das als erstes aufegrufen wurde (StartScript.ps1).

Dazu finde ich einfach nichts.

lg

Mayho
Member: colinardo
Solution colinardo May 11, 2014, updated at May 13, 2014 at 08:33:38 (UTC)
Goto Top
hey ho.
Zitat von @mayho33:
$MyInvocation.ScriptName gibt ja nur den Namen des eigenen Scripts wider.
Das stimmt so nicht, es gibt den kompletten Pfad des Scripts wieder welches das Script in dem $MyInvocation verwendet wird, aufgerufen hat ! Es enthält also immer das Vorgängerscript. Ist hier auch bei meinen Tests eindeutig nachvollziehbar und steht auch so in der Doku:

$MyInvocation
Contains an information about the current command, such as the name,
parameters, parameter values, and information about how the command was
started, called, or "invoked," such as the name of the script that called
the current command.


nicht das Ergebnis das ich haben will: Den Pfad zu dem Script das als erstes aufgerufen wurde
ah ok so meinst du das... hier sollten dir je nachdem wie deine erste Konsole aufgerufen wird, folgende zwei Commands helfen:
[environment]::CommandLine
# oder
[environment]::GetCommandLineArgs()
Das erste beinhaltet die komplette Befehlszeile des ersten Aufruf's der Konsole inklusive aller Parameter. Das zweite enthält alle Parameter in einem Array bereit.
Bei einem Aufruf eines Powershell-Scripts via Rechtsklick Ausführen mit Powershell... befindet sich der Scriptpfad an dritter Position des Arrays ([environment]::GetCommandLineArgs()[2]

Es kommt hier aber wie gesagt darauf an wie das erste Script bzw. die Konsole (Das Environment) aufgerufen wird, sonst bleibt der Inhalt der Commands leer.

Grüße Uwe
Member: SaschaRD
Solution SaschaRD May 13, 2014, updated at May 16, 2014 at 18:06:07 (UTC)
Goto Top
Hallöchen,

suchst Du so etwas?
Get-ChildItem '.\' | WHERE {$_.extension -like '*.ps1'} | % {  
	Write-Host $_.FullName -ForegroundColor Blue
	}

Gruß, Sascha
Member: mayho33
mayho33 May 13, 2014 at 08:33:24 (UTC)
Goto Top
Hi Uwe!

Zitat von @colinardo:

hey ho.
> Zitat von @mayho33:
> $MyInvocation.ScriptName gibt ja nur den Namen des eigenen Scripts wider.
Das stimmt so nicht, es gibt den kompletten Pfad des Scripts wieder...

Ja! Muss wohl genauer beschreiben.. face-smile

ah ok so meinst du das... hier sollten dir je nachdem wie deine erste Konsole aufgerufen wird, folgende zwei Commands helfen:
> [environment]::CommandLine
> # oder
> [environment]::GetCommandLineArgs()
> 
Das erste beinhaltet die komplette Befehlszeile des ersten Aufruf's der Konsole inklusive aller Parameter. Das zweite
enthält alle Parameter in einem Array bereit.
Bei einem Aufruf eines Powershell-Scripts via Rechtsklick Ausführen mit Powershell... befindet sich der Scriptpfad an
dritter Position des Arrays ([environment]::GetCommandLineArgs()[2]

Es kommt hier aber wie gesagt darauf an wie das erste Script bzw. die Konsole (Das Environment) aufgerufen wird, sonst bleibt
der Inhalt der Commands leer.

Suuuuper! Habe mich im Framework schon auf die Suche gemacht, aber wo anfangen. Da fehlt mir echt noch der Überblick, obwohl ich schon lange code. MS hat ja ne ganz eigene Art zuzuordnen....Ich auch...
Hab's zwar noch nicht getestet, aber ich glaube ich kann davon ausgehen, dass es funkt...wie immer!

lg

mayho
Member: mayho33
mayho33 May 13, 2014, updated at May 16, 2014 at 18:05:59 (UTC)
Goto Top
Hi Sascha!

Ne eigentlich nicht! Ich möchte schon genau wissen wer "mich" (das Script am Ende des Ratten###es) von wo aufruft. Sie das Beispiel weiter oben.

lg

Mayho

EDIT: 16.05.2014

Hi Uwe!

zu:
Zitat von colinardo:
$MyInvocation.ScriptName gibt ja nur den Namen des eigenen Scripts wider.

Da habe ich anfangs wohl was falsch gemacht. Gibt braf den Name/Pfad zurück des Script welches aufruft.

Zitat von colinardo:
[environment]::CommandLine
  1. oder
[environment]::GetCommandLineArgs()


Gibt leider auch nicht die ganze Befehlskette zurück, aber damit muss ich wohl leben.

Danke für die Hilfe!

lg Mayho!