none
Symlink Ziel per Script aendern RRS feed

  • Frage

  • Hallo liebe Leser,

    aktuell haben wir folgendes Problem,

    wir hatten per Script in einer Ordnerstruktur nach Dateien mit der Endung *.mrk suchen lassen.

    Diese wurden dann in einem Ordner verschoben und danach erstellte das Script an dem Ursprungsort der jeweiligen Datei eine Verknüpfung mit dem neuen Ziel der Datei.

    Leider ist und bei der Angabe des Laufwerksbuchstabens im Zielpfad ein Fehler unterlaufen. Nun befinden sich alle *.mrk Dateien zwar an ihrem neuen Ort, die erstellten Verknüpfungen gehen aber leider nicht.

    Jetzt versuchen wir mithilfe eines anderen Scriptes die Pfad in jeder gefundenen Verknüpfung auszulesen und mit einem neuen, geänderten Pfad wieder zu speichern.

    Das klappt wunderbar im Test auf einem Windows 10 Client.
    Wenn wir dieses Script aber auf einem Windows 2012 R2 Server ausführen, werden ab einem bestimmten Punkt keine Schritte mehr abgearbeitet und die Verknüpfungen erhalten als Ziel "Computer" und gehen somit nicht.

    Wir brauchen hier eure Unterstützung!
    Hier erst einmal das Script:

    #modify variables accordingly 
    $fileName ="*.mrk" 
    $folder = "C:\Users\Doe\Documents\Powershell" 
    [string]$from = "C:\Users\Doe\Documents\Ziel\" 
    [string]$to = "C:\Users\Doe\Documents\Ziel1\" 
    $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) 
          { 
     #create the shortcut object
     $WshShell = New-Object -ComObject WScript.Shell
     [string]$path = (Get-Item $lnk).DirectoryName
     write $path
     [string]$name = (Get-Item $lnk).Name.Replace(".mrk",".lnk")
     write $name
     $Shortcut = $WshShell.CreateShortcut("$($path)\$($name)")
     #program the shortcut will open
    [string]$lnkTarget = (Get-Item $lnk).Target
    write $lnkTarget
    $lnkTarget = ($lnkTarget).Replace($from,$to)
    write $lnkTarget
     $Shortcut.TargetPath = $lnkTarget
     #save the modifications
     $Shortcut.Save()
    
     write " "
    
       Remove-Item $lnk
    
      } 
    

    Ab der Zeile 19 ([string]$lnkTarget = (Get-Item $lnk).Target) geht nichts mehr.
    Das System findet wohl .Target nicht.

    Wie gesagt, das Script funktioniert einwandfrei auf einem Windows 10 System.

    Weiß hier jemand, woran das liegen kann?

    Vielen, vielen Dank im Voraus

    Grüße Oliver


    Donnerstag, 11. Juli 2019 11:24

Antworten

  • > $list = Get-ChildItem -Path $folder -Filter $fileName -Recurse  | Where-Object { $_.Attributes -ne "Directory"} | select -ExpandProperty FullName

    Wenn Du hier das ExpandProperty wegläßt, dann bleiben das Objekte und Du sparst Dir die ganzen "get-item $lnk" in der Schleife... Warum  machen so viele immer die Objekte kaputt? Und Filtern auf Directory brauchst auch nicht - "gci -File".

    > [string]$lnkTarget = (Get-Item $lnk).Target

    Dann schau doch mal auf dem 2012R2, was da so in den Variablen drinsteht... Breakpoint am Ende der Foreach Schleife. Oder ist da evtl. kein Powershell 5 installiert? Dann kennt Get-Item noch keine Symlinks...


    Greetings/Grüße, Martin - https://mvp.microsoft.com/en-us/PublicProfile/5000017 Mal ein gutes Buch über GPOs lesen? - http://www.amazon.de/Windows-Server-2012--8-Gruppenrichtlinien/dp/3866456956 Good or bad GPOs? My blog - http://evilgpo.blogspot.com And if IT bothers me? Coke bottle design refreshment - http://sdrv.ms/14t35cq

    Donnerstag, 11. Juli 2019 13:07

Alle Antworten

  • > $list = Get-ChildItem -Path $folder -Filter $fileName -Recurse  | Where-Object { $_.Attributes -ne "Directory"} | select -ExpandProperty FullName

    Wenn Du hier das ExpandProperty wegläßt, dann bleiben das Objekte und Du sparst Dir die ganzen "get-item $lnk" in der Schleife... Warum  machen so viele immer die Objekte kaputt? Und Filtern auf Directory brauchst auch nicht - "gci -File".

    > [string]$lnkTarget = (Get-Item $lnk).Target

    Dann schau doch mal auf dem 2012R2, was da so in den Variablen drinsteht... Breakpoint am Ende der Foreach Schleife. Oder ist da evtl. kein Powershell 5 installiert? Dann kennt Get-Item noch keine Symlinks...


    Greetings/Grüße, Martin - https://mvp.microsoft.com/en-us/PublicProfile/5000017 Mal ein gutes Buch über GPOs lesen? - http://www.amazon.de/Windows-Server-2012--8-Gruppenrichtlinien/dp/3866456956 Good or bad GPOs? My blog - http://evilgpo.blogspot.com And if IT bothers me? Coke bottle design refreshment - http://sdrv.ms/14t35cq

    Donnerstag, 11. Juli 2019 13:07
  • Gab's die Symlinks nicht schon mit Version 4?  ... na egal ...

    Ich wollte auch grad empfehlen, statt der ranzigen WshShell-Objekte und -Methoden, einfach New-Item mit -ItemType SymbolicLink zu verwenden - is doch gleich viel cooler.  ;-)


    Live long and prosper!

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


    • Bearbeitet BOfH-666 Donnerstag, 11. Juli 2019 13:17
    Donnerstag, 11. Juli 2019 13:17
  • Ich gehe mal davon aus, dass Du lieber dort weitermachen möchtest ...  ;-)

    https://www.mcseboard.de/topic/215884-symlink-ziel-per-script-aendern/


    Live long and prosper!

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

    Donnerstag, 11. Juli 2019 15:21
  • Gab's die Symlinks nicht schon mit Version 4?  ... na egal ...

    Ich wollte auch grad empfehlen, statt der ranzigen WshShell-Objekte und -Methoden, einfach New-Item mit -ItemType SymbolicLink zu verwenden - is doch gleich viel cooler.  ;-)


    Live long and prosper!

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


    In der Tat brauchen wir Framewok 5.. Damit gehts ..

    Manchmal ist es ganz einfach.

    Vielen Dank für eure Hilfe!!!!

    Grüße Oliver

    Freitag, 12. Juli 2019 05:32