Pfade aller Link-Dateien ändern
Hallo zäme,
Durch das Verschieben von Laufwerksnamen, müssen die LNK-Dateien entsprechend angepasst werden. Natürlich mittels BATCH.
Bestimmt schon viele mal gefragt, aber trotzdem finde ich nichst entsprechendes, ausser der Beitrag Link Dateien ändern wobei dort die Datei mit dem Power-Script nicht mehr zum DL vorhanden.
Hätte mir da jemand einen Tipp?
Vielen Dank und Grus
Dani
Durch das Verschieben von Laufwerksnamen, müssen die LNK-Dateien entsprechend angepasst werden. Natürlich mittels BATCH.
Bestimmt schon viele mal gefragt, aber trotzdem finde ich nichst entsprechendes, ausser der Beitrag Link Dateien ändern wobei dort die Datei mit dem Power-Script nicht mehr zum DL vorhanden.
Hätte mir da jemand einen Tipp?
Vielen Dank und Grus
Dani
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 33882395705
Url: https://administrator.de/forum/pfade-aller-link-dateien-aendern-33882395705.html
Ausgedruckt am: 22.12.2024 um 15:12 Uhr
9 Kommentare
Neuester Kommentar
Hi
also mit Batch alleine wirst du da nicht glücklich.
Ich hab vor ein paar Jahren das da in Powershell gebastelt um das gleiche zu erreichen.
$folder wird durchsucht nach LNK Dateien und
$r definiert welcher alte Pfad mit welchem neuen ersetzt wird. Kann man auch mehrere Angeben
also mit Batch alleine wirst du da nicht glücklich.
Ich hab vor ein paar Jahren das da in Powershell gebastelt um das gleiche zu erreichen.
$folder wird durchsucht nach LNK Dateien und
$r definiert welcher alte Pfad mit welchem neuen ersetzt wird. Kann man auch mehrere Angeben
$fileName ="*.lnk"
$folder = "\\contoso.de\dfs\dfs\location"
$list = Get-ChildItem -Path $folder -Filter $fileName | Where-Object { $_.Attributes -ne "Directory"} | select -ExpandProperty FullName
$obj = New-Object -ComObject WScript.Shell
$r = @{
"\\oldserver\share\department" = "\\contoso.de\dfs\location\department";
}
ForEach($lnk in $list)
{
$obj = New-Object -ComObject WScript.Shell
$link = $obj.CreateShortcut($lnk)
[string]$workingdir = $link.WorkingDirectory
[string]$path = $link.TargetPath
Write-Host "Alt: $path"
foreach($k in $r.GetEnumerator()){
$path = $path.ToLower()
$workingdir = $workingdir.ToLower()
$path = $path.replace($k.Name, $k.Value)
$workingdir = $workingdir.replace($k.Name, $k.Value)
}
Write-Host "Neu: $path"
$link.TargetPath = $path
$link.WorkingDirectory = $workingdir
$link.Save()
}
.replace() ist case sensitive und im Ablauf mache ich mit .tolower() alles klein, während dein $r ein grosses "C:\" enthält.
Entsprechend findet er beim Replace den Text nicht.
Also entweder das C:\ klein machen (c:\) oder das tolower überall entfernen.
Das hatte ich bei mir weil ich in der drumherum liegenden Funktion alles klein mache.
Oder du verwendest Powershell7 und machst da dann
.replace($k.Name, $k.Value,'OrdinalIgnoreCase').
Entsprechend findet er beim Replace den Text nicht.
Also entweder das C:\ klein machen (c:\) oder das tolower überall entfernen.
Das hatte ich bei mir weil ich in der drumherum liegenden Funktion alles klein mache.
Oder du verwendest Powershell7 und machst da dann
.replace($k.Name, $k.Value,'OrdinalIgnoreCase').
Hi.
Eine Liste von Dateien muss man nicht erst als Textdatei generieren, das macht die Powershell On the fly von selbst mit "Get-ChildItem", auch rekursiv wenn man den Parameter "-Recurse" verwendet.
Das hier sollte das für dich erledigen.
Gruß und viel Erfolg
Katrin.
Eine Liste von Dateien muss man nicht erst als Textdatei generieren, das macht die Powershell On the fly von selbst mit "Get-ChildItem", auch rekursiv wenn man den Parameter "-Recurse" verwendet.
Das hier sollte das für dich erledigen.
$folder = 'C:\quelldaten'
$search = 'C:\Temp\old'
$replace = 'D:\temp\new'
$shell = New-Object -Com Wscript.Shell
foreach($file in Get-ChildItem -LiteralPath $folder -File -Filter *.lnk -Recurse){
$link = $shell.CreateShortcut($file.Fullname)
$link.TargetPath = $link.TargetPath.toLower().replace($search.ToLower(),$replace)
$link.WorkingDirectory = $link.WorkingDirectory.toLower().replace($search.ToLower(),$replace)
$link.Save()
}
Katrin.
Ich habe noch das toLower entfernt
Nein bitte nicht, wenn du das machst werden Unterschiede in Groß- und Kleinschreibung zwischen Suchstring und tatsächlichem Pfad zur Fehlerquelle und es wird potentiell keine Ersetzung vorgenommen weil Replace Case-Sensitive ist!! Diese haben schon einen Sinn und sind nicht überflüssig!Das war auch der Grund für die fehlende Ersetzung unter "WorkingDirectory" die du oben selbst entdeckt hast, dort war nämlich das "t" von "Temp" klein geschrieben und deswegen wurde es nicht ersetzt!