Вы вызываете powershell 3 раза, они не разделяют одну и ту же область.
- Добавьте команды в одну строку, разделенные точкой с запятой, чтобы иметь одну область видимости.
- Используйте переменную окружения
APPDATA
для адресации папки для текущего пользователя.
:: Q:\Test\2018\10\02\SU_1363191.cmd
@ECHO OFF
FOR %%i IN ("%AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\*.lnk") DO (
powershell -Nop -c "$sh = New-Object -ComObject WScript.Shell;\".lnk: {0}`nPath: {1}`n\" -f '%%~nxi',$sh.CreateShortcut('%%i').TargetPath"
)
Вышеупомянутый пакет довольно медленный, так как он вызывает powershell отдельно для каждой итерации %%i
, этот сценарий powershell выполняет итерацию самих файлов .lnk.
## Q:\Test\2018\10\02\SU_1363191.ps1
$sh = New-Object -ComObject WScript.Shell
Get-ChildItem "$($Env:AppData)\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\*.lnk"|
%{".lnk: {0}`nPath: {1}`n" -f $_.Name,$sh.CreateShortcut($_.FullName).TargetPath}
а также может быть упакован в партию:
:: Q:\Test\2018\10\02\SU_1363191_2.cmd
@powershell -Nop -c "$sh = New-Object -ComObject WScript.Shell;gci \""$($Env:AppData)\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\*.lnk\""|ForEach{\"".lnk: {0}`nPath: {1}`n\"" -f $_.Name,$sh.CreateShortcut($_.FullName).TargetPath}"
Один и тот же пример вывода для всех 3 вариантов:
> SU_1363191.cmd
.lnk: Bash on Ubuntu on Windows.lnk
Path: C:\Windows\System32\bash.exe
.lnk: Command Prompt.lnk
Path: C:\WINDOWS\system32\cmd.exe
.lnk: Mozilla Firefox.lnk
Path: C:\Program Files\Mozilla Firefox\firefox.exe
.lnk: PowerShell 6 (x64).lnk
Path: C:\Program Files\PowerShell\6\pwsh.exe
.lnk: Visual Studio Code.lnk
Path: C:\Program Files\Microsoft VS Code\Code.exe