Jump to content

Powershell - auslesen des aktuellen Pfades


Direkt zur Lösung Gelöst von Sunny61,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo Forum,

 

ich habe ein kleines Problem und hoffe, es gibt eine einfache Lösung hierzu:

Ich habe ein Powershell-Skript geschrieben, welches ich auf einem Netzlaufwerk (nennen wir es Z:\Skripte\meinSkript.ps1) abgelegt habe.

Dieses Skript schreibt Log-Dateien, die im gleichen Verzeichnis erzeugt werden sollen (Z:\Skripte\Logs)

Ausserdem soll dieses Skript von allen meinen Kollegen benutzt werden können, die sich das Netzlaufwerk aber nicht alle mit "Z:\" gemappt haben.

 

Um die Log-Datein also an dem gewünschten Ort abzulegen, muss ich den Netzwerkpfad der ps1-Datei auslesen.

 

Jetzt gibt es ein paar Probleme:

- Windows öffnet ps.1-Dateien standardmäßig mit einem Text-Editor (Doppelklick auf die Datei führt diese nicht aus)

- Ich kann/darf aus der ps.1 keine exe kompilieren, die per Doppelklick ausgeführt werden könnte

- mein Script MUSS in einer 32 Bit Variante von PowerShell ausgeführt werden (weil ich Lotus Notes abfrage) - Das heisst, "rechter Mausklick/öffnen mit Powershell" lässt das Skript abbrechen, weil Powershell standardmäßig in einer 64 bit Version startet

 

Ich muss das Skript also in einer "Powershell ISE" öffnen (vor Allem meine nicht PowerShell-affinen Kollegen). Hier steht der Fokus natürlich auf C:\Windows\System32

 

Lese ich jetzt den Pfad mit  "get-location" oder "PWD" aus, bekomme ich natürlich "C:\Windows\System32" geliefert. Dies kann ich dann natürlich nicht verwenden, um den Pfad für eine Log-Datei in dem Netzlaufwerk zu generieren.

Ich kann den Kollegen auch nicht sagen, dass sie sich das Programmverzeichnis alle auf den eigenen Rechner kopieren sollen und die erzeugten Logs dann manuell auf dem Netzlaufwerk ablegen sollen.

 

Wie bekomme ich also in der "Power Shell ISE" den Pfad in eine Variable, in der die ps1-Datei liegt?

 

Vielen Dank für einen Tipp

Gruß

Holger

 

 

 

 

 

 

 

 

 

 

Link zu diesem Kommentar
vor 6 Minuten schrieb newbi2009:
 

Dieses Skript schreibt Log-Dateien, die im gleichen Verzeichnis erzeugt werden sollen (Z:\Skripte\Logs)

Ausserdem soll dieses Skript von allen meinen Kollegen benutzt werden können, die sich das Netzlaufwerk aber nicht alle mit "Z:\" gemappt haben.

Moin Holger,

wozu Laufwerk?
Der UNC Pfad dürfe bei allen Anwendern gleich sein...

Und es wäre ggf. hilfreich, wenn die Script-Experten (wie z.B. Olaf ...) das mal sehen könnten...

Einfach als Code einfügen...

Warum darfst du das nicht kompilieren?

:-)

Link zu diesem Kommentar
vor 41 Minuten schrieb newbi2009:

Jetzt gibt es ein paar Probleme:

Das ist das falsche Wort. Wir nennen das Herausforderung.   ;-)

 

vor 41 Minuten schrieb newbi2009:

- Windows öffnet ps.1-Dateien standardmäßig mit einem Text-Editor (Doppelklick auf die Datei führt diese nicht aus)

Hangeln sich Deine Kollegen alle in diesen Ordner und führen das Dingens aus, oder wäre es nicht eine Idee, den Kollegen eine Verknüpfung in Startmenü oder auf dem Desktop zur Verfügung zu stellen? Da können sie dann auch einfach drauf klicken.

 

vor 41 Minuten schrieb newbi2009:

- mein Script MUSS in einer 32 Bit Variante von PowerShell ausgeführt werden (weil ich Lotus Notes abfrage) - Das heisst, "rechter Mausklick/öffnen mit Powershell" lässt das Skript abbrechen, weil Powershell standardmäßig in einer 64 bit Version startet

 

Für diese Herausforderung wäre auch eine entsprechende Verknüpfung die Lösung. Darin kann man problemlos die 32-Bit-Version der PowerShell "hart verdrahten" und das Script per UNC-Pfad übergeben. 

 

vor 41 Minuten schrieb newbi2009:

Ich muss das Skript also in einer "Powershell ISE" öffnen

Warum? Die ISE ist nur für die Script-Entwicklung gedacht - ausgeführt werden Scripte üblicherweise mit PowerShell.exe. 

 

vor 41 Minuten schrieb newbi2009:

Lese ich jetzt den Pfad mit  "get-location" oder "PWD" aus,

Dafür gibt es die zur Laufzeit automatisch befüllte Variable "$PSScriptRoot". 

 

vor 41 Minuten schrieb newbi2009:

Dieses Skript schreibt Log-Dateien, die im gleichen Verzeichnis erzeugt werden sollen (Z:\Skripte\Logs)

Je nach Umfang des Scripts und der erzeugten Log-Dateien, ist es keine gute Idee direkt auf einem Netzlaufwerk zu loggen. Dateisystem-Zugriffe bremsen sowieso schon enorm. Und wenn das dann noch Richtung Netzwerk geht vermindert das die Leistung nochmal deutlich.

bearbeitet von BOfH_666
Link zu diesem Kommentar

Hallo Nobby,

 

danke für die Antwort.

Naja, die Firmen-Policies lassen es einfach nicht zu, exe-Dateien selber zu kompilieren

Der UNC-Pfad sollte tatsächlich bei allen Benutzern gleich sein. Dann müsste ich den "Installationspfad" aber manuell in das Skript schreiben

ala: \\Server\Freigabe\Skripte

 

Das würde mit Sicherheit auch funktionieren.

Ich würde das Ganze aber gerne eleganter lösen. Z.B. für den Fall, dass das Verzeichnis "Skripte" einmal an einen anderen Ort verschoben werden sollte

 

Mein Skript sieht in etwa so aus:

 

function Uhr()
{
 $Date = Get-Date
 $Time= $Date.toString()("yyyy-MM-dd_HH.mm.ss")
 $Datum= $Time.toString("yyyy-MM-dd")
}

$InstallPath = $PWD.ToString()
Uhr
$LogDateiName = "$InstallPath\Logs\$Satum\MeinSkriptname_" + $Time +".log"
.
.
.
write-output "Diese Zeile soll in die Log-Datei eingetragen werden" | Tee-Object -FilePath $LogDateiName -append

 

 

Danke und Gruß

Holger

 

 

 

Hallo BOfH_666,

 

auch Dir "danke" für Deine Antwort.

 

Ich möchte es eigentlich vermeidenzu allen Kollegen zu latschen und einen Link auf die ps.1-Datei zu erstellen.

Ausserdem bin ich mir nicht ganz sicher, ob der Link das Problem lösen würde.

Es würde dann doch der Pfad des lokalen Rechners ausgelesen - also würden die Log-Dateien wieder nicht alle im gleichen Verzeichnis (Netzlaufwerk) landen.....

 

Dass die Datei mit der PowerShell.exe ausgeführt werden sollte ist mir schon klar. Aber es wird (glaube ich) halt standardmäßig die 64bit Version ausgeführt, die gegen die Pumpe läuft, wenn man versucht damit eine LotusNotes-Anwendung auszulesen....

 

Und alles andere als rechter Mausklick / Ausführen mit  kann ich meinen Kollegen nicht zumuten :-)

Link zu diesem Kommentar
  • Beste Lösung

Zum Thema Pfad des Scriptes auslesen findest Du hier ein Beispiel: https://www.itnator.net/psscriptroot-beinhaltet-pfad-des-powershell-scripts/

Bau dir das mal in dein Script an der richtigen Stelle ein und lass dir mit write-host $PSScriptRoot den Pfad ausgeben. Wenn es der richtige ist, dann geht es weiter.

 

Verknüpfungen legt man nicht manuell an, sondern lässt sie per GPO bei den betroffenen Usern *aktualisieren*, dann passt der Aufruf. ;)

Link zu diesem Kommentar
vor 44 Minuten schrieb Sunny61:

Zum Thema Pfad des Scriptes auslesen findest Du hier ein Beispiel: https://www.itnator.net/psscriptroot-beinhaltet-pfad-des-powershell-scripts/

Bau dir das mal in dein Script an der richtigen Stelle ein und lass dir mit write-host $PSScriptRoot den Pfad ausgeben. Wenn es der richtige ist, dann geht es weiter.

 

Verknüpfungen legt man nicht manuell an, sondern lässt sie per GPO bei den betroffenen Usern *aktualisieren*, dann passt der Aufruf. ;)

THIS did the trick  :thumb1:

Vielen Dank!!

Link zu diesem Kommentar
vor 3 Stunden schrieb newbi2009:

Ich möchte es eigentlich vermeidenzu allen Kollegen zu latschen und einen Link auf die ps.1-Datei zu erstellen.

Dafür gibt es Software-Deployment-Lösungen oder GPOs.

 

vor 3 Stunden schrieb newbi2009:

Ausserdem bin ich mir nicht ganz sicher, ob der Link das Problem lösen würde.

Ich schon.

vor 3 Stunden schrieb newbi2009:

Es würde dann doch der Pfad des lokalen Rechners ausgelesen - also würden die Log-Dateien wieder nicht alle im gleichen Verzeichnis (Netzlaufwerk) landen.....

Nein, würde es nicht.

 

vor 3 Stunden schrieb newbi2009:

Dass die Datei mit der PowerShell.exe ausgeführt werden sollte ist mir schon klar. Aber es wird (glaube ich) halt standardmäßig die 64bit Version ausgeführt, die gegen die Pumpe läuft, wenn man versucht damit eine LotusNotes-Anwendung auszulesen....

Deswegen schrub ich auch, dass Du die 32-Bit-Version in der Verknüpfung "FEST VERDRAHTEN" kannst. Du kannst doch selbst bestimmen, was ausgeführt wird, indem Du den gewünschten Pfad der 32-Bit-Version der PowerShell.exe angibst.  

 

vor 3 Stunden schrieb newbi2009:

Und alles andere als rechter Mausklick / Ausführen mit  kann ich meinen Kollegen nicht zumuten :-)

Dazu sage ich jetzt nix weiter.

Link zu diesem Kommentar

Ich hätte ja dann einfach ne CMD gemacht gleichen Namens mit - sinngemäß - diesem Inhalt:

%systemroot%\WindowsPowershell\v1.0\powershell.exe -ExecutionPolicy Bypass -File "%~dpn0.ps1"

Die startet mit Doppelklick problemlos, weil die Verknüpfung von .CMD zu cmd.exe in nahezu keiner Umgebung aufgehoben wird.

 

Ob man in 32 oder 64 Bit läuft, läßt sich dann über $env:Processor_Architecture herausfinden, und notfalls spawnt man sich selbst dann noch mal aus Syswow64. Hab ich alles schon hinter mir :-)

 

Warum muß man immer alles compilen und rückwärts durch den Kamelhintern durch das Nadelöhr fädeln? SCNR 😂

bearbeitet von daabm
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...