none
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

    Freitag, 10. August 2018 12:45

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_symbolic

    Lösche die alten Links und estelle dann neue.

    Freitag, 10. August 2018 12:59
  • 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''



    Samstag, 11. August 2018 22:33

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_symbolic

    Lösche die alten Links und estelle dann neue.

    Freitag, 10. August 2018 12:59
  • -Werbung gelöscht -

    Bitte keine reine Werbung posten.
    Du kannst dich aber gerne -konstruktiv- an der Diskussion beteilligen und deinen Link in die Signatur schreiben.
    Denniver

    Freitag, 10. August 2018 19:38
  • 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  

    Samstag, 11. August 2018 08:42
  • Hallo Tom,

    Dein Video werde ich mir gerne ansehen.

    Gruss

    hajosch

    Samstag, 11. August 2018 08:43
  • 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''

    Samstag, 11. August 2018 09:14
  • Meine Antwort "nach zeitaufwendigen Versuchen bin ich schließlich doch an der mir völlig fremden Syntax als Powershell-Neuling gescheitert. " bezog sich auf die genannte Web-Adresse.
    Samstag, 11. August 2018 16:20
  • 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''



    Samstag, 11. August 2018 22:33
  • Der erste command hat erfolgreich die Dateien entfernt.

    Mt dem zweitem command komme ich weiterhin nicht klar.

    Ich gebe die Sache auf und werde eben jede ungültige (alte) Verknüpfung per Hand einzeln aktualisieren.

    Danke für die Bemühungen!

    hajosch



    Montag, 13. August 2018 07:54
  • 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''

    Montag, 13. August 2018 08:02
  • 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.

    Montag, 13. August 2018 08:43
  • 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
    Montag, 13. August 2018 09:14
  • 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.

    Was für ein Buch hast du gelesen?
    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.
    Montag, 13. August 2018 11:29
  • 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


    Montag, 13. August 2018 14:39
  • 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
    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.


    Dienstag, 14. August 2018 09:42
  • 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
    Dienstag, 14. August 2018 14:58
  • 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.

    Donnerstag, 16. August 2018 09:50
  • Hab ich was verpasst? Was ist das Problem?

    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Donnerstag, 16. August 2018 12:22