Ok, verstehe.
Dann folgendes:
1. Stelle bitte sicher, dass du, wenn du das script ausführst im Zielordner bist (bei dir also in diesem Fall "C:\Z")
2. Das script fragt dich nach dem cloud path, von dem du aus kopiert hast. Bei deinem Beispiel war das nun:
"O:\Cloud\OneDrive\test160413".
Diesen Pfad trägst du in der Abfrage ein. Am besten per Copy & Paste. Ohne Anführungszeichen!. Ob mit oder
ohne abschließendem "\" ist egal.
O:\Cloud\OneDrive\test160413
und
O:\Cloud\OneDrive\test160413\
sind also äquivalent.
Jetzt sucht das script alle .lnk Dateien die es unter (hier: C:\Z) finden kann, holt sich jeweils das Ziel der Verknüpfung raus,
wirft den von dir eingefügten Teil des cloud Pfadnamens (auch wenn es hier ein lokaler Laufwerksbuchstabe ist!) raus und setzt
den aktuellen Pfad (also wieder C:\Z) davor ein. Das funktioniert natürlich auch für Strukturen mit Unterordnern und für .lnk Dateien, die eine Verknüpfung auf eine Datei außerhalb ihres eigenen Verzeichnisses aufweisen.
Dann schaut es nach, ob die Datei auf die der neue Link zeigen würde existiert und wenn ja löscht es die alte .lnk Datei und legt
eine neue mit der korrekten Verknüpfung an. Ist die Zieldatei nicht vorhanden, weil die .lnk z.B. auf eine Datei verweist die außerhalb der von dir kopierten Struktur liegt, bricht das script nicht ab, sondern sammelt diese falschen links in einem Log, welches am Ende der Aktion angezeigt wird...
Wie gesagt, probiere es an Backupdateien aus, ich nutze den ganzen Cloudschwachsinn nicht für "echte" Daten (und schon gar kein OneDrive...) und spiele das Ganze nur mit lokalen Testdaten durch...
Code: Select all
$log = "";
$lnks = formatlist(quicksearch("*.lnk /f"), "f", <crlf>, "!*$RECYCLE.BIN*<crlf>*System Volume Information*");
$onlinePath = trim(input("Enter the cloud path you've copied from..."), "\", "R");
setting "BackgroundFileOps", 0;
foreach($lnk, $lnks, <crlf>) {
$lnkPath = gpc($lnk, "path");
$lnkTarget = property("#LinkTarget", $lnk);
// Build new target link
$newLnkTarget = <curpath> . "\" . substr($lnkTarget, strlen($onlinePath) + 1);
if !(exists($newLnkTarget)) {
$log = $log . "$newLnkTarget -> Points to an unknown file...<crlf>";
continue;
} else {
delete 1, 0, $lnk;
new($lnk, "link", $newLnkTarget);
}
}
if ($log) { text $log; }
else { text "No inconsistencies found, all .lnk files should now point to their real (local) target!"; }