본문

드라이브 문자 변경으로 인한 깨진 .LNK (바로가기) 파일 수정하기

일반적인 파일은 2중 백업으로 관리하지만 음악파일은 3중 백업을 사용한다. Sync 프로그램을 사용해서 백업 동기화를 하는데 그중에서 음악파일은 윈도우 바로가기를 활용하는 경우가 있어서 이부분을 처리해 줘야 한다. 여태까지 Primary 백업디스크를 다른 백업디스크들이 수동적으로 미러링하는 구조여서 별문제가 없었는데, Primary 백업디스크에서 관리되는 파일이 많다보니 전원 연결이 잦아서 걱정이 생겼다. 결국 Primary의 수명보호를 위해서 또다른 디스크를 메인으로 사용하고 Primary에 집산하는 구조로 운용방침을 변경했다.

 

LNK 파일은 메모장에서 열어보면 다양한 정보가 있음을 확인할 수 있는데 흔히 사용되는 파워쉘 CreateShortcut() 메소드로 LNK파일을 열어보면 별다른 내용이 출력되지 않아 아쉬웠다. 다른 언어로는 LNK 파일 파서들이 여럿 공개되어있지만 파워쉘버전은 찾기 어려웠고, 그래서 python의 LnkParse3 을 사용해 보았는데 command line 에서 사용하기도 괜찮아서 차용하기로 하였다. Parser를 사용하면서 특히나 좋았던 부분은 Relative path 값을 불러올 수 있다는것이다. 나의경우에는 백업과정에서 드라이브명이 변경되면서 바로가기 경로가 박살난 경우인데 Relative path값으로 이를 보정해주면 깨진 링크가 되살아난다.

 

아래의 파워쉘 코드를 실행시키면 현재 폴더 내부의 lnk 파일들 각각의 Relative path 값을 읽어서 이를 바탕으로 새 바로가기 경로를 형성하고 이를 바탕으로 기존 바로가기를 업데이트 해준다. 문제가 되는 부분은 유니코드 (–, -와 모양이 비슷함)가 파일경로에 있을경우 오류가 나서 바로가기가 업데이트 되지 않는다는 점인데 (스샷 참조), LnkParse3 의 출력부분에서 문제가 있는것으로 보여 바로 수정가능하겠지만 귀찮아서 차라리 이참에 폴더명을 고치기로 했다.

$WshShell = New-Object -comObject WScript.Shell
$Shortcuts = Get-ChildItem -Path . -Recurse -Include *.lnk -Force
foreach ($Shortcut in $Shortcuts)
{
	$Shortcut = $WshShell.CreateShortcut($Shortcut.FullName)
	$Shortcut.TargetPath=[System.IO.Path]::GetFullPath((lnkparse $Shortcut.FullName | Select-String -Pattern 'Relative path').ToString().Split(':')[1].Trim())
	$Shortcut.Save()
}

댓글 1

  • 게스트 썸네일
    2022.09.20 02:19 신고

    $wshShell = New-Object -ComObject wscript.shell
    $LinksFolder = (Get-Item .).FullName
    $findStr = 'F:\Classicals\'
    $replaceStr = 'C:\temp\copy\'

    gci $LinksFolder *.lnk -recurse | select -expand fullname | Foreach{
    $src=($wshShell.CreateShortcut($_)).TargetPath
    $dst=($wshShell.CreateShortcut($_)).TargetPath.Replace($findStr, $replaceStr)
    [PSCustomObject]@{
    'Shortcut' = $_
    'Source' = $src
    'Destination' = $dst
    }
    Copy-Item -Path $src -Recurse -Destination $dst -Container
    } | out-gridview

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.