2016-01-30 2 views
3

Мне нужна помощь для преобразования всех ярлыков Windows в относительные ссылки (символические ссылки) с помощью PowerShell. Все исходные файлы (цели ярлыков) находятся в одной папке, а внутри него есть еще одна папка с файлами, ярлыками и другими папками (которые могут содержать другие файлы, ярлыки и папки).Заменить ярлык с относительной символической связью во вложенных папках

Что я ищу, таким образом, сделать эту команду для каждого ярлыка (с дополнительной ../ в конечном счете):

cmd /c 'mklink "path/shortcut.txt" "../file.txt"' && del "path/shortcut.txt.lnk" 

С помощью этого кода я могу получить абсолютный путь к цели ярлыка:

dir * -Include *.lnk -Recurse | ForEach-Object { 
    $sh = New-Object -ComObject WScript.Shell 
    $fullpath = $sh.CreateShortcut($_.FullName).TargetPath 
} 

Любая помощь? Как я могу найти его путь и число ../?

+2

'Resolve-Path -Relative' – PetSerAl

+2

Я бы не стал рекомендовать это делать. Ярлыки обеспечивают больше функциональности, чем просто путь к некоторому файлу. –

+0

Мне нужны символические ссылки, потому что они работают с linux и другими программами (например, FTP), а также могут иметь относительный путь. – Xenon

ответ

1

Я думаю, что нашел, как это сделать. Это сценарий:

$obj = New-Object -ComObject WScript.Shell; 
dir * -Include *.lnk -Recurse | ForEach-Object { 
    $file = $obj.CreateShortcut($_.FullName).TargetPath -Replace '.*\\' 
    $name = $(Resolve-Path -Relative $_) -Replace '^\.\\' -Replace "\.lnk$" 
    $rel = ''; 
    for ($i=0; $i -le ([regex]::Matches($nomeok, '\\')).count; $i++) { 
     $rel = $rel + '..\\' 
    } 
    cmd /c mklink "$name" "$($rel + $file)" 
    del "$($name + '.lnk')" 
} 
Смежные вопросы