Benutzer mit den meisten Antworten
Verknüpfungsziel ändern

Frage
-
Hallo,
ein umfangreicher, verknüpfter Dateibestand (Ordner mit Unterordnern) wurde in einen anderen Ordner verschoben. Ich möchte in einem Rutsch die Pfade aller Link-Dateien mit dem neuen Verzeichnis als Verknüpfungsziel versehen.
Folgendes Script funktioniert nicht richtig:
# modLink.ps1 alle Verknüpfungsziele im Ordner und seinen Unterordnern ändern $fileName ="*.lnk" # Verknüpfung suchen $folder = "H:\Temp\Verknüpfungen-Test" # im Verzeichnis [string]$from = "H:\tools\*.*" # bisheriges Verknüpfungsziel [string]$to = "Z:\hajo\Tools\*.*" # neues Verknüpfungsziel $list = Get-ChildItem -Path $folder -Filter $fileName -Recurse | Where-Object { $_.Attributes -ne "Directory"} | select -ExpandProperty FullName $obj = New-Object -ComObject WScript.Shell ForEach($lnk in $list) { $obj = New-Object -ComObject WScript.Shell $link = $obj.CreateShortcut($lnk) [string]$path = $link.TargetPath [string]$path = [string]$path.Replace($from.tostring(),$to.ToString()) #If you need workingdirectory change please uncomment the below line. #$link.WorkingDirectory = [string]$WorkingDirectory.Replace($from.tostring(),$to.ToString()) #$link.Arguments = "-arguments" $link.TargetPath = [string]$path $link.Save() }
Kann mir jemand das script berichtigen?
Gruß hajosch
Antworten
-
Wieso erstellst du ständig eine neues Wscrip.Shell-Object?
Eins würde da komplett genügen.Aber es geht auch einfacher:
https://docs.microsoft.com/de-de/powershell/wmf/5.0/feedback_symbolicLösche die alten Links und estelle dann neue.
- Als Antwort markiert Denniver ReiningMVP, Moderator Donnerstag, 16. August 2018 14:11
-
Hmmm ... nicht so schnell aufgeben ... einfach so lange rumprobieren bis es funktioniert (nur bitte nicht mit den Original-Daten ;-) )
Aslo:
$ZielPfad = 'Pfad in dem die alten .lnk Dateien liegen' $QuellPfad = 'Pfad in dem die Dateien liegen, die verknüpft werden sollen' Get-ChildItem -Path $ZielPfad -Filter *.lnk -File -Recurse -Force | Remove-Item -Recurse -Force Get-ChildItem -Path $QuellPfad -Recurse -File -Force | ForEach-Object{ New-Item -ItemType SymbolicLink -Path $ZielPfad -Name $_.BaseName -Value $_.FullName }
Du durchsuchst den Pfad, in dem die alten Verknüpfungen liegen und putzt diese erstmal weg. Dann holst Du Dir die Dateien, die neu verknüpft werden sollen aus dem Quell-Pfad und benutzt den puren Dateinamen ohne Endung als Name für die neue Verknüpfung. Als Verknüpfungsziel benutzt Du den kompletten Dateinamen inclusive Pfad - Fertig.
Best regards,
(79,108,97,102|%{[char]$_})-join''
- Bearbeitet BOfH-666 Samstag, 11. August 2018 22:38
- Als Antwort markiert Denniver ReiningMVP, Moderator Donnerstag, 16. August 2018 14:12
Alle Antworten
-
Wieso erstellst du ständig eine neues Wscrip.Shell-Object?
Eins würde da komplett genügen.Aber es geht auch einfacher:
https://docs.microsoft.com/de-de/powershell/wmf/5.0/feedback_symbolicLösche die alten Links und estelle dann neue.
- Als Antwort markiert Denniver ReiningMVP, Moderator Donnerstag, 16. August 2018 14:11
-
Hallo bfuerchau,
nach zeitaufwendigen Versuchen bin ich schließlich doch an der mir völlig fremden Syntax als Powershell-Neuling gescheitert. Das in meiner ersten Frage aufgezeichnete Script ist nicht von mir.
Könntest Du mir freundlicherweise die Befehlszeile aufschreiben?
Im Ordner 'H:\Temp\Verknüpfungen-Test' und allen seinen Unterordnern die Verknüpfungsziele von 'H:\Tools'
in 'Z:\Hajo\Tools' ändern.
Danke hajosch
# modLink.ps1 alle Verknüpfungsziele im Ordner und seinen Unterordnern ändern $fileName ="*.lnk" # Verknüpfung suchen $folder = "H:\Temp\Verknüpfungen-Test" # im Verzeichnis [string]$from = "H:\tools\*.*" # bisheriges Verknüpfungsziel [string]$to = "Z:\hajo\Tools\*.*" # neues Verknüpfungsziel
-
Dein Video werde ich mir gerne ansehen.
Wow ... ehrlich? Du willst jetzt nochmal 10 Tage warten, bis Du eventuell eine Antwort auf Deine Frage erhältst? Hast Du Dir denn die Seite mal angesehen, die bfuerchau oben gepostet hatte?
Hier nochmal direkt zum Draufklicken: https://docs.microsoft.com/de-de/powershell/wmf/5.0/feedback_symbolic.
Best regards,
(79,108,97,102|%{[char]$_})-join''
-
Hmmm ... nicht so schnell aufgeben ... einfach so lange rumprobieren bis es funktioniert (nur bitte nicht mit den Original-Daten ;-) )
Aslo:
$ZielPfad = 'Pfad in dem die alten .lnk Dateien liegen' $QuellPfad = 'Pfad in dem die Dateien liegen, die verknüpft werden sollen' Get-ChildItem -Path $ZielPfad -Filter *.lnk -File -Recurse -Force | Remove-Item -Recurse -Force Get-ChildItem -Path $QuellPfad -Recurse -File -Force | ForEach-Object{ New-Item -ItemType SymbolicLink -Path $ZielPfad -Name $_.BaseName -Value $_.FullName }
Du durchsuchst den Pfad, in dem die alten Verknüpfungen liegen und putzt diese erstmal weg. Dann holst Du Dir die Dateien, die neu verknüpft werden sollen aus dem Quell-Pfad und benutzt den puren Dateinamen ohne Endung als Name für die neue Verknüpfung. Als Verknüpfungsziel benutzt Du den kompletten Dateinamen inclusive Pfad - Fertig.
Best regards,
(79,108,97,102|%{[char]$_})-join''
- Bearbeitet BOfH-666 Samstag, 11. August 2018 22:38
- Als Antwort markiert Denniver ReiningMVP, Moderator Donnerstag, 16. August 2018 14:12
-
-
Mt dem zweitem command komme ich weiterhin nicht klar.
Ich persönlich fände es hilfreich, wenn Du nicht ganz so nebulös antworten würdest. Was heißt "... komme ich nicht klar"? Bekommst Du eine Fehlermeldung? Wenn ja, welche? Wenn nein, was passiert sonst?
Best regards,
(79,108,97,102|%{[char]$_})-join''
-
Es wird schwierig, wenn die Syntax nicht bekannt ist; auch ein PowerShell-Buch hat nicht weitergeholfen.
Ausgabe nach Eingabe der angegebenen Befehlszeilen:
Windows PowerShell
Copyright (C) Microsoft Corporation. Alle Rechte vorbehalten.
PS C:\WINDOWS\system32> $ZielPfad = "H:\Temp\ Verknüpfungen-neu-Test" ^I
>> $QuellPfad ="H:\Temp\Verknüpfungen-Test" ^I
>>
>> Get-ChildItem -Path $ QuellPfad -Recurse -File -Force |
>> ForEach-Object{
>> New-Item -ItemType SymbolicLink -Path $ZielPfad -Name $_.BaseName -Value $_.FullName }
>>
>>
Get-ChildItem : Der Zugriff auf den Pfad "C:\WINDOWS\system32\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache\Content.IE5" wurde verweigert.
In Zeile:4 Zeichen:1
+ Get-ChildItem -Path $ QuellPfad -Recurse -File -Force |
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (C:\WINDOWS\syst...che\Content.IE5:String) [Get-ChildItem], UnauthorizedAccessException
+ FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
Get-ChildItem : Der Zugriff auf den Pfad "C:\WINDOWS\system32\LogFiles\WMI\RtBackup" wurde verweigert.
In Zeile:4 Zeichen:1
+ Get-ChildItem -Path $ QuellPfad -Recurse -File -Force |
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (C:\WINDOWS\syst...es\WMI\RtBackup:String) [Get-ChildItem], UnauthorizedAccessException
+ FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
PS C:\WINDOWS\system32>
Die Zugriffsverweigerung konnte ich nicht aufheben.
-
Wenn Du Code postest, formatier diesen doch bitte auch als Code. So ist es nahezu unlesbar. Wenn das nicht ein Kopierfehler ist ... zwischen dem Dollarzeichen ($) und dem Variablennamen darf kein Leerzeichen sein. Also nicht so "$ QuellPfad" sondern so "$QuellPfad"
Zum Thema "Es wird schwierig, wenn die Syntax nicht bekannt ist; auch ein PowerShell-Buch hat nicht weitergeholfen." kann ich nur sagen: Vielleicht solltest Du damit beginnen, Dir die Grundlagen von Powershell anzueignen. Scheinbar fehlt Dir da noch ein ganzes Stück. Jedes cmdlet kommt üblicherweise mit einer Hilfe, die Du direkt in Powershell mit Get-Help aufrufen kannst. Für die meisten Sachen sind auch einigermaßen Hilfreiche Beispiele enthalten. In diesem Fall wäre dann Get-Help New-Item -Full vermutlich die richtige Lektüre für Dich. Du sagst, ein Buch hätte Dir auch nicht geholfen - hast Du das Buch nur zum Nachschlagen benutzt, oder es wirklich gelesen?
Ein kostenloser und niedrigschwelliger Einstieg gelingt auch mit einem Videokurs in der Microsoft Virtual Academy - Getting Started with Powershell.
Best regards,
(79,108,97,102|%{[char]$_})-join''
- Bearbeitet BOfH-666 Montag, 13. August 2018 09:16
-
Es wird schwierig, wenn die Syntax nicht bekannt ist; auch ein PowerShell-Buch hat nicht weitergeholfen.
Ausgabe nach Eingabe der angegebenen Befehlszeilen:
Windows PowerShell
Copyright (C) Microsoft Corporation. Alle Rechte vorbehalten.
PS C:\WINDOWS\system32> $ZielPfad = "H:\Temp\ Verknüpfungen-neu-Test" ^I
>> $QuellPfad ="H:\Temp\Verknüpfungen-Test" ^I
>>
>> Get-ChildItem -Path $ QuellPfad -Recurse -File -Force |
>> ForEach-Object{
>> New-Item -ItemType SymbolicLink -Path $ZielPfad -Name $_.BaseName -Value $_.FullName }
>>
>>
Get-ChildItem : Der Zugriff auf den Pfad "C:\WINDOWS\system32\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache\Content.IE5" wurde verweigert.
In Zeile:4 Zeichen:1
+ Get-ChildItem -Path $ QuellPfad -Recurse -File -Force |
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (C:\WINDOWS\syst...che\Content.IE5:String) [Get-ChildItem], UnauthorizedAccessException
+ FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
Get-ChildItem : Der Zugriff auf den Pfad "C:\WINDOWS\system32\LogFiles\WMI\RtBackup" wurde verweigert.
In Zeile:4 Zeichen:1
+ Get-ChildItem -Path $ QuellPfad -Recurse -File -Force |
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (C:\WINDOWS\syst...es\WMI\RtBackup:String) [Get-ChildItem], UnauthorizedAccessException
+ FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
PS C:\WINDOWS\system32>
Die Zugriffsverweigerung konnte ich nicht aufheben.
Folge doch einfach mal den Links und Ratschlägen, im Netz gibt es oft mal Code der herauskopiert werden kann, der Text im Buch scheint ja etwas zu klein gedruckt zu sein, als dass man die Syntax genau erschließen könnte. -
Prozedur mit Ergebnis als eingefügter Codeblock:
Windows PowerShell Copyright (C) Microsoft Corporation. Alle Rechte vorbehalten. PS C:\WINDOWS\system32> $ZielPfad = " Verknüpfungen-Test mit Unterordnern" >> $QuellPfad = " Verknüpfungen-Test" >> >> Get-ChildItem -Path $ZielPfad -Filter *.lnk -File -Recurse -Force | >> Remove-Item -Recurse -Force >> >> Get-ChildItem -Path $QuellPfad -Recurse -File -Force | >> ForEach-Object{ >> New-Item -ItemType SymbolicLink -Path $ZielPfad -Name $_.BaseName -Value $_.FullName >> } >> >> Get-ChildItem : Der Zugriff auf den Pfad "C:\WINDOWS\system32\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache\Content.IE5" wurde verweigert. In Zeile:4 Zeichen:1 + Get-ChildItem -Path $ZielPfad -Filter *.lnk -File -Recurse -Force | + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : PermissionDenied: (C:\WINDOWS\syst...che\Content.IE5:String) [Get-ChildItem], UnauthorizedAccessException + FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand Get-ChildItem : Der Zugriff auf den Pfad "C:\WINDOWS\system32\LogFiles\WMI\RtBackup" wurde verweigert. In Zeile:4 Zeichen:1 + Get-ChildItem -Path $ZielPfad -Filter *.lnk -File -Recurse -Force | + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : PermissionDenied: (C:\WINDOWS\syst...es\WMI\RtBackup:String) [Get-ChildItem], UnauthorizedAccessException + FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand Get-ChildItem : Der Zugriff auf den Pfad "C:\WINDOWS\system32\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache\Content.IE5" wurde verweigert. In Zeile:7 Zeichen:1 + Get-ChildItem -Path $QuellPfad -Recurse -File -Force | + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : PermissionDenied: (C:\WINDOWS\syst...che\Content.IE5:String) [Get-ChildItem], UnauthorizedAccessException + FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand Get-ChildItem : Der Zugriff auf den Pfad "C:\WINDOWS\system32\LogFiles\WMI\RtBackup" wurde verweigert. In Zeile:7 Zeichen:1 + Get-ChildItem -Path $QuellPfad -Recurse -File -Force | + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : PermissionDenied: (C:\WINDOWS\syst...es\WMI\RtBackup:String) [Get-ChildItem], UnauthorizedAccessException + FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand PS C:\WINDOWS\system32>
Mein Buch:
© 2014 Carl Hanser Fachbuchverlag
Holger Schwichtenberg
Windows PowerShell 4.0
Das Praxisbuch
-
Du willst uns testen, oder? ;-) :-D
Du machst jedesmal ein klein wenig andere Fehler ... hab ich den Eindruck. ;-)
Du musst schon einen für Deine Umgebung sinnvollen Pfad eintragen. Mit den "Erklärtexten" von mir als Pfadnamen funktioneirt das leider nicht. ;-) ;-)
Kopier doch einfach den Code, den ich gepostet hatte in den Scriptbereich einer Powershell_ISE. Dann klannst Du jede einzelne Zeile, bzw. jeden zusammengehörigen Befehlsblock einzeln ausführen und das Ergebnis testen. Wenn Du z.B. den Cursor in die Ziele mit dem $QuellPfad = 'H:\Temp\Verknüpfungen-Test' stellst, dann F8 drückst und danach mal nur den Variablennamen markierst und dann wieder F8 drückst, kannst Du kontrollieren, dass der Variablen $QuellPfad ein korrekter Wert zugewiesen wurde.
Wenn Du ein bissl Zeit erübrigen kannst und eingermaßen der englischen Sprache mächtig bist, schau Dir doch den Video-Kurs mal an, den ich oben verlinkt hatte. Der zeigt Dir z.B. auch ein wenig, wie man ein Script oder Code generell "debugged".
Best regards,
(79,108,97,102|%{[char]$_})-join''
- Bearbeitet BOfH-666 Montag, 13. August 2018 14:49
-
Es klappt einfach nicht; das liegt entweder an einer mißverständlichen Formulierung meines Problems oder an meinem fehlenden Verständnis bezüglich PowerShell, deshalb möchte ich mein Anliegen noch einmal präzisieren:
im Ordner "H:\Temp\Verknüpfungen-Test\..." und seinen Unterordnern befinden sich Dateien des Typs 'Verknüpfung', die nach Rechtsklick (Eigenschaften) als Verknüpfung - Ziel den Eintrag 'H:\Tools\.....' haben.
Dieser Ziel-Eintrag soll in allen Dateien, auch in den Unterordnern, geändert werden in 'Z:\Hajo\Tools\.....
Zur Vermeidung nochmaliger Fehler meinerseits bitte ich, in das zuletzt genannte Script meine Bezeichnungen an der richtigen Stelle einzutragen.
Läßt sich die Anzahl der geänderten Link-Dateien ausgeben?
Vielen Dank für die bis hier gezeigte Geduld.
Gruß hajosch
Das Drücken der F8-Taste erzeugte keine Reaktion.
-
Es klappt einfach nicht
Ich glaube, ich hatte das schon mal erwähnt. Mit solchen Aussagen kann man nix anfangen. Das hier ist ein technisches Forum. Versuch doch wenigstens den Fehler zu beschreiben, wenn Du einen bekommst bzw. was nicht klappt. Idealerweise postest Du hier Fehlermeldungen (nur eine, wenn Du mehrere gleiche erhältst und bitte auch als Code formatiert. ;-) )
.. oder an meinem fehlenden Verständnis bezüglich PowerShell
Deshalb meine Empfehlung, die ich hier auch nochmal bekräftigen möchte, sich erstmal die Grundlagen anzueignen. Lies das Buch vom Holger Schwichtenberg komplett und/oder schau Dir den Video-Kurs an, den ich oben schon mal verlinkt hatte. Ohne die Grundlagen zu kennen, wirst Du auch vermutluch auch Probleme haben, die Hilfen, die Dir hier geboten werden zu verstehen.
Dieser Ziel-Eintrag soll in allen Dateien, auch in den Unterordnern, geändert werden
Ach Du willst die OrdnerStruktur erhalten? Das hatte ich wohl missverstanden. Wäre es nicht einfacher, die Verknüpfungen alle flach in einem Ordner zu haben? Dann brauchst Du Dich nicht bis in irgend eine Ebene durchzuklicken? .... na egal. In dem Fall müssen wir mit den Zielpfaden ein bissl tricksen ... so hier ungefähr:
$ZielPfad = 'H:\Temp\Verknüpfungen-Test' $QuellPfad = 'Z:\Hajo\Tools' Get-ChildItem -Path $ZielPfad -Filter *.lnk -File -Recurse -Force | Remove-Item -Recurse -Force Get-ChildItem -Path $QuellPfad -Recurse -File -Force | ForEach-Object{ $NewPath = Join-Path -Path $ZielPfad -ChildPath ( $_.FullName -replace [REGEX]::Escape($QuellPfad) -replace [REGEX]::Escape($(Split-Path $_.FullName -Leaf)) ) New-Item -ItemType SymbolicLink -Path $NewPath -Name $_.BaseName -Value $_.FullName -Force }
Das Drücken der F8-Taste erzeugte keine Reaktion.
... wie gesagt - Grundlagen - wie bediene/benutze ich die Powershell_ISE !!
Best regards,
(79,108,97,102|%{[char]$_})-join''
- Bearbeitet BOfH-666 Dienstag, 14. August 2018 14:59
-
Wo finde ich den Eintrag für den bisherigen Link 'H:\Temp' ?
Ich werde mich an diesem Thema wegen der fruchtlosen Themabewältigung nicht mehr beteiligen.
Gruß hajosch
Abschließender Tipp für die Beantwortung einer Frage:
1. Testdatei erstellen
2. Script oder Befehlszeile erstellen
3. Script oder Befehlszeile testen ....
4. funktionierendes Ergebnis veröffentlichen
5. überflüssige, weil nicht zielführende, Bemerkungen unterlassen.
- Als Antwort markiert hajosch Donnerstag, 16. August 2018 09:50
- Tag als Antwort aufgehoben Denniver ReiningMVP, Moderator Donnerstag, 16. August 2018 14:11
-
Wo finde ich den Eintrag für den bisherigen Link 'H:\Temp' ?
Ich werde mich an diesem Thema wegen der fruchtlosen Themabewältigung nicht mehr beteiligen.
Gruß hajosch
Abschließender Tipp für die Beantwortung einer Frage:
1. Testdatei erstellen
2. Script oder Befehlszeile erstellen
3. Script oder Befehlszeile testen ....
4. funktionierendes Ergebnis veröffentlichen
5. überflüssige, weil nicht zielführende, Bemerkungen unterlassen.
Hier ist Hilfe zur Selbsthilfe angesagt, nicht aber "Ey ich brauch da so nen Script, könnt ihr mir das mal bitte schreiben?"!