Tmax 0 Geschrieben 11. Juli 2019 Melden Teilen Geschrieben 11. Juli 2019 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 Zitieren Link zu diesem Kommentar
MurdocX 949 Geschrieben 11. Juli 2019 Melden Teilen Geschrieben 11. Juli 2019 Hier gibt es eine Menge Optimierungspotential :) Fangen wir mal oben an. Wofür wird diese Zeile gebraucht? $obj = New-Object -ComObject WScript.Shell Warum wandelt Ihr Objekte in Strings um, wenn Ihr weiter unten über Get-Item wieder das gleiche Objekt erstellt? ... | select -ExpandProperty FullName (Get-Item $lnk).DirectoryName Wichtig, Wichtig u. Wichtig: Für Euch und für andere die das Debuggen müssen. Bitte keine Kürzel wie "select" wählen, wenn es ausgeschrieben ein "Select-Object" ist. Das Gleiche gilt für "write" das ein "Write-Output" ist. Zitieren Link zu diesem Kommentar
Tmax 0 Geschrieben 11. Juli 2019 Autor Melden Teilen Geschrieben 11. Juli 2019 (bearbeitet) Hallo Jan, in der Tat ist die Zeile $obj = New-Object -ComObject WScript.Shell überflüssig. Das Script haben wir aus bereits bestehenden Codezeilen zusammen gebaut. Daher können wir leider nicht jede Zeile wirklich erklären *Dummy mode on* Das Komische ist eben, dass wir zum gewünschten Ergebnis kommen, wenn wir das auf ner W10 Kiste laufen lassen. Warum hier Objekte in Strings umgewandelt werden, kann ich dir leider aus oben genannten Grund nicht sagen. Vielleicht kommen wir mit deiner Hilfe aber trotzdem zu einer Lösung. bearbeitet 11. Juli 2019 von Tmax Zitieren Link zu diesem Kommentar
MurdocX 949 Geschrieben 11. Juli 2019 Melden Teilen Geschrieben 11. Juli 2019 vor 57 Minuten schrieb Tmax: Ab der Zeile 19 ([string]$lnkTarget = (Get-Item $lnk).Target) geht nichts mehr. Habt Ihr den Befehl für eine Datei schon mal händisch in die Powershell geschrieben und geschaut ob da überhaupt etwas raus kommt? (Get-Item -Path 'MeinPfad_ZurMrkDate.mrk').Target Zitieren Link zu diesem Kommentar
Tmax 0 Geschrieben 11. Juli 2019 Autor Melden Teilen Geschrieben 11. Juli 2019 Wenn das gesammte Script ausgeführt wird, kommt auch was raus. Der Befehl einzeln klappt nicht. Zitieren Link zu diesem Kommentar
MurdocX 949 Geschrieben 11. Juli 2019 Melden Teilen Geschrieben 11. Juli 2019 Der Befehl ist zusammenhängend. Alle zusammenhänge zusammengenommen, ergeben das was ich euch geschrieben habe Damit hat der Dateityp "MRK" wohl kein Target. Darin liegt der Fehler. Da Ihr Target wieder weiterverarbeitet, dieser aber leer ist, kommt auch unten nichts sinnvolles bei raus. Vielleicht geht ein manuelles umbenennen in lnk vorher? Probiert es mal aus. Zitieren Link zu diesem Kommentar
Tmax 0 Geschrieben 11. Juli 2019 Autor Melden Teilen Geschrieben 11. Juli 2019 Ich gehe nicht davon aus, dass es daran liegt. Die Verknüpfungsdatei ist also .symlink Datei erstellt worden. Diese hat ihren ursprüngliche Dateierweiterung behalten, sprich *.mrk Zitieren Link zu diesem Kommentar
MurdocX 949 Geschrieben 11. Juli 2019 Melden Teilen Geschrieben 11. Juli 2019 (bearbeitet) vor 9 Minuten schrieb Tmax: Ich gehe nicht davon aus, dass es daran liegt. Es geht nicht darum was euch der Explorer anzeigt, sondern was der Befehl liefert den ihr selber verwendet. # Befehl 1 [string]$lnkTarget = (Get-Item $lnk).Target # Befehl 2 in Abhängigkeit von Befehl 1 $lnkTarget = ($lnkTarget).Replace($from,$to) Wie soll der zweite Befehl was tauschen, wenn Ihr ihm nichts liefert. Selber habt Ihr getestet und es nichts bei raus. Ergo, ist die Eigenschaft 'Target' die Falsche. Ich habe hier keine MRK-Datei, um das Auslesen zu testen. bearbeitet 11. Juli 2019 von MurdocX Zitieren Link zu diesem Kommentar
Tmax 0 Geschrieben 11. Juli 2019 Autor Melden Teilen Geschrieben 11. Juli 2019 #modify variables accordingly $fileName ="*.mrk" $folder = "C:\Users\ojohn\Documents\Powershell" [string]$from = "C:\Users\ojohn\Documents\Ziel\" [string]$to = "C:\Users\ojohn\Documents\Ziel1\" $list = Get-ChildItem -Path $folder -Filter $fileName -Recurse | Where-Object { $_.Attributes -ne "Directory"} | select -ExpandProperty FullName ForEach($lnk in $list) { #create the shortcut object $WshShell = New-Object -ComObject WScript.Shell #program the shortcut will open [string]$lnkTarget = (Get-Item $lnk).Target write $lnkTarget $lnkTarget = ($lnkTarget).Replace($from,$to) write $lnkTarget } Ausgeführt: C:\Users\ojohn\Documents\Ziel\1.mrk C:\Users\ojohn\Documents\Ziel1\1.mrk C:\Users\ojohn\Documents\Ziel\2.mrk C:\Users\ojohn\Documents\Ziel1\2.mrk C:\Users\ojohn\Documents\Ziel\3.mrk C:\Users\ojohn\Documents\Ziel1\3.mrk C:\Users\ojohn\Documents\Ziel\4.mrk C:\Users\ojohn\Documents\Ziel1\4.mrk C:\Users\ojohn\Documents\Ziel\5.mrk C:\Users\ojohn\Documents\Ziel1\5.mrk Wie gesagt, lokal funktioniert das Script, wenn wir das gleiche auf dem Server (Win2012R2) ausführen kommt kein Ergebnis. Zitieren Link zu diesem Kommentar
MurdocX 949 Geschrieben 11. Juli 2019 Melden Teilen Geschrieben 11. Juli 2019 vor 32 Minuten schrieb Tmax: Wie gesagt, lokal funktioniert das Script, wenn wir das gleiche auf dem Server (Win2012R2) ausführen kommt kein Ergebnis. Mal einfach gefragt. Passt Ihr dann auch die Variablen oben $From, $To u. $Folder an? Zitieren Link zu diesem Kommentar
MurdocX 949 Geschrieben 11. Juli 2019 Melden Teilen Geschrieben 11. Juli 2019 #requires -Version 3.0 [string]$FileFilter ='*.mrk' [string]$RootFolder = 'C:\Users\Doe\Documents\Powershell' [string]$LinkTargetOld = 'C:\Users\Doe\Documents\Ziel' [string]$LinkTargetNew = 'C:\Users\Doe\Documents\Ziel1' $FileList = Get-ChildItem -Path $RootFolder -Filter $FileFilter -File # Create shortcuts and remove file ForEach($FileItem in $FileList) { $Shortcut = $null [string]$NewFileName = $FileItem.Name.Replace('.mrk','.lnk') [string]$NewLinkTarget = $FileItem.Target.Replace($LinkTargetOld,$LinkTargetNew) $Shortcut = (New-Object -ComObject WScript.Shell).CreateShortcut("$RootFolder\$NewFileName") $Shortcut.TargetPath = $NewLinkTarget $Shortcut.Save() Remove-Item -Path $FileItem } Ich hab mir erlaubt eure Variante "etwas" gerade zu rücken. Also komplett neu geschrieben. Ihr seht den Unterschied... Probiert das mal auf dem Server. Von Deinem Skript bekommt man ja Augenkrebs 1 Zitieren Link zu diesem Kommentar
Beste Lösung daabm 1.354 Geschrieben 11. Juli 2019 Beste Lösung Melden Teilen Geschrieben 11. Juli 2019 Naja, man könnte Forenregeln lesen und auf Crossposts hinweisen In Powershell 4 (mit der 2012R2 ab Werk kam) kennt Get-Item noch kein .Target... Das kam erst mit Version 5. Deshalb geht's auch mit Win10... 1 Zitieren Link zu diesem Kommentar
Tmax 0 Geschrieben 12. Juli 2019 Autor Melden Teilen Geschrieben 12. Juli 2019 vor 10 Stunden schrieb daabm: Naja, man könnte Forenregeln lesen und auf Crossposts hinweisen In Powershell 4 (mit der 2012R2 ab Werk kam) kennt Get-Item noch kein .Target... Das kam erst mit Version 5. Deshalb geht's auch mit Win10... Hallo Martin, der 1. Preis geht an dich. In der Tat geht es, wenn man auf dem Server das Framework hochzieht. Einen großen Dank auch an Jan, für die Script Korrektur!!! Ih beide habt uns sehr geholfen Grüße Oliver vor 15 Stunden schrieb MurdocX: Mal einfach gefragt. Passt Ihr dann auch die Variablen oben $From, $To u. $Folder an? Ja, das machen wir schon.. Zitieren Link zu diesem Kommentar
MurdocX 949 Geschrieben 12. Juli 2019 Melden Teilen Geschrieben 12. Juli 2019 Ahhhh! @daabm Mich ärgert gerade das ich darauf nicht gekommen bin Zitieren Link zu diesem Kommentar
daabm 1.354 Geschrieben 12. Juli 2019 Melden Teilen Geschrieben 12. Juli 2019 Ich hatte nen Vorsprung - die Frage kam im Technet früher, da hab ich mal kurz recherchiert Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.