daniwa
Goto Top

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

Content-ID: 33882395705

Url: https://administrator.de/contentid/33882395705

Ausgedruckt am: 27.09.2024 um 01:09 Uhr

SeaStorm
SeaStorm 29.10.2023 aktualisiert um 18:23:32 Uhr
Goto Top
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
$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() 
}
DaniWa
DaniWa 29.10.2023 um 19:17:34 Uhr
Goto Top
Hi SeaStorm,
Vielen Dank! Leider will es (noch) nicht bei mir. LNK-File liegt in C:\Temp
prtscr1-script

In den Eigenschaften passiert aber nix...
prtscr1-eigenschaften

Was übersehe ich?

Ich kann eine Textdatei mit allen LNK-Dateien inkl.Pfad und Name generieren. Schlussendlich muss ich ja nur den Laufwerksbuchstaben auswechslen. Kann eine solche Datei 'abgespuhlt' werden?
SeaStorm
SeaStorm 29.10.2023 um 20:32:12 Uhr
Goto Top
.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').
DaniWa
DaniWa 30.10.2023 um 10:40:03 Uhr
Goto Top
Perfekt. Hat geklapp! Vielen Dank.

Nun noch 2 Punkte:

1. Ausführen in:
Wie kann dieser Eintrag ebenfalls angepasst werden?
prtscr2-pfad

2. Liste zum Abarbeiten:
Ich kann eine Textdatei mit allen LNK-Dateien inkl.Pfad und Name generieren. Schlussendlich muss ich ja nur den Laufwerksbuchstaben auswechslen. Wie kann eine solche Liste als Textdatei abgearbeitet werden?

Besten Dank für Deine Hilfe!
DaniWa
DaniWa 30.10.2023 um 10:48:12 Uhr
Goto Top
zu 2.
es würde auch ausreichen, wenn z.B. anstelle $folder = "C:\Temp" sämtliche *.lnk Dateien im C:\Temp inkl. aller Unterverzeichnisse abgearbeitet würden. Weiss aber nicht ob das geht...
8030021182
Lösung 8030021182 30.10.2023 aktualisiert um 11:10:08 Uhr
Goto Top
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.
$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()
}
Gruß und viel Erfolg
Katrin.
DaniWa
DaniWa 30.10.2023 um 11:50:15 Uhr
Goto Top
Hi Katrin,

Vielen Dank für Deinen Hinweis. Ich habe noch das toLower entfernt und das passt nun so für mich.

$folder = 'C:\Temp\Rename'
$search = 'G:\'
$replace = 'D:\'
$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.replace($search,$replace)
$link.WorkingDirectory = $link.WorkingDirectory.replace($search,$replace)
$link.Save()
}


Gruss
Dani
8030021182
8030021182 30.10.2023 aktualisiert um 11:58:58 Uhr
Goto Top
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!
DaniWa
DaniWa 30.10.2023 um 21:03:59 Uhr
Goto Top
Okitoki, vielen Dank für Deinen Hinweis.