tex15
Goto Top

Mit Powershell Name der Verknüpfung herausfinden

Hey.
Sorry für den Titel, mir ist nichts aussagekräftigeres eingefallen.

Ich weiß nicht ob mein Problem lösbar ist. Mal sehen, ob ihr Ideen habt:

Also ich erstelle ein Verknüpfung (wieheisseich.lnk). Die Verkn. hat das Ziel:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -file test.ps1
Ich möchte jetzt in der test.ps1 wissen, wie der Dateiname der Verknüpfung ist.

Ich möchte also, dass das Skript test.ps1 sich anders verhält je nachdem ob es via wieheisseich.lnk oder anderername.lnk aufgerufen wird.

Eventuell gibt es eine Möglichkeit. Ich teste unter Win11 mit Windows-Terminal. Der Fenstername des Terminalfensters ändert sich auf den Namen der verwendeten Verknüpfung. Dreckig könnte ich also die offenen Fenster parsen, aber vielleicht geht es besser.

Ich freue mich auf euere Ideen.

Grüße,
Tex

Content-ID: 72641350336

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

Ausgedruckt am: 22.11.2024 um 20:11 Uhr

Rotkaeppchen
Rotkaeppchen 18.12.2023 um 17:00:37 Uhr
Goto Top
Ist das vielleicht deine Lösung was du haben möchtest?

# In test.ps1
$Verknuepfungspfad = $_
$VerknuepfungsDateiname = [System.IO.Path]::GetFileNameWithoutExtension($Verknuepfungspfad)

if ($VerknuepfungsDateiname -eq "wieheisseich") {  
    # Verknüpfung heißt wieheisseich.lnk
    # Führe den entsprechenden Code aus
} elseif ($VerknuepfungsDateiname -eq "anderername") {  
    # Verknüpfung heißt anderername.lnk
    # Führe den entsprechenden Code aus
}
tex15
tex15 18.12.2023 um 17:09:53 Uhr
Goto Top
Ah sorry. Ich habe ein wenig gekürzt.

Die Verknüpfung und das Script liegen nicht im selben Verzeichnis.
Die 2 Verknüpfungen können im selben Verzeichnis liegen, müssen aber nicht. Ich kann also nicht mit CurrentPath arbeiten.

Also, vielen Dank, aber so klappt es leider nicht.
10138557388
10138557388 18.12.2023 aktualisiert um 17:24:07 Uhr
Goto Top
write-host ((gps -id $pid).MainWindowTitle -split ": ")[-1]  
pj
tex15
tex15 18.12.2023 aktualisiert um 17:32:17 Uhr
Goto Top
Hm.

Funktioniert bedingt. Weil die Powershell, die im Windows Terminal geöffnet wird, eine eigene PID hat. Der WindowTitle gehört aber zum WindowsTerminal.

Folglich:

write-host (gps -id $pid).MainWindowTitle
--> LEER
write-host (gps WindowsTerminal).MainWindowTitle
--> wieheisseich

Damit kann ich zumindest arbeiten. Eventuell muss ich im Script abfangen, ob das Terminal verwendet wird oder nicht.
Ich teste das mal auf einer Win10 VM ohne Terminal.

Danke.
3063370895
3063370895 19.12.2023 aktualisiert um 07:22:03 Uhr
Goto Top
Hi,

Was du eigentlich willst ist mW nicht möglich.

Wie wäre es wenn du stattdessen in der Verknüpfung ein Argument an das PS-Script übergibst?

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -file "C:\script.ps1" hallo  

param (
	[string]$arg
)

Write-Host "Verknüpfung: $arg"  
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')  

-Thomas
tex15
tex15 19.12.2023 um 08:47:30 Uhr
Goto Top
Hey,

ja ich befürchte es auch.
Argument funktioniert natürlich. Aber das, was ich möchte, soll genau das Argument ersetzten, um mein Skript für ONU's zugänglicher zu machen.

Konkret: Das Skript soll Dateinamen taggen. Also beispielsweise "TODO" hinzufügen.

Ich erstelle also eine Verknüpfung zum Skript, benenne die in TODO.lnk, und kann dann da eine Datei drauf Drag&Dropen und die wird getagged.
Wenn jetzt ein ONU eigene Tags erfinden möchte, kann er ganz einfach den Lnk kopieren, umbenennen und loslegen.

Ich kann im Skript natürlich ne Abfrage machen, welchen Tag der User will, oder eben ein Argument in der Lnk mitgeben, aber für den User wäre der oben beschriebene Wege wesentlich komfortabler.

So was in der Art könnte gehen.
$title=(gps WindowsTerminal -ErrorAction SilentlyContinue).MainWindowTitle
if ($title -eq $null) {$title=(gps -id $pid).MainWindowTitle}
write-host $title

Grüße,
Tex
TK1987
TK1987 19.12.2023 aktualisiert um 12:42:27 Uhr
Goto Top
Moin,

Zitat von @tex15:
Argument funktioniert natürlich. Aber das, was ich möchte, soll genau das Argument ersetzten, um mein Skript für ONU's zugänglicher zu machen.
...
Ich erstelle also eine Verknüpfung zum Skript, benenne die in TODO.lnk, und kann dann da eine Datei drauf Drag&Dropen und die wird getagged.
das ist doch viel zu kompliziert 🤪.

Prinzipiell ist dein Vorhaben problemlos möglich, allerdings nicht per lnk. Du kannst dir dafür einfach einen eigenen Dateitypen definieren, nehmen wir als Beispiel mal ".tag". Erstelle folgende Registry-Schlüssel:
Schlüssel Wert
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.tag open
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.tag\shell\open\command C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -nologo -file "<Scriptpfad>" "%1" %*
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.tag\shellex\DropHandler {60254CA5-953B-11CF-8C96-00AA00B8708C}

Fortan braucht man nur eine neue Datei mit der Endung ".tag" erstellen - und kann beliebig Dateien auf diese Datei drauf ziehen.

Das erste Argument ist die .tag-Datei, alle weiteren die jeweiligen Dateien, die per Drag&Drop auf diese gezogen wurden.

Gruß Thomas
tex15
Lösung tex15 21.12.2023 um 11:50:43 Uhr
Goto Top
Hi Thomas,

auf die Idee bin ich nicht gekommen.
Das funktioniert in der Tat super.

Danke,
Tex