.TargetPath 此时是意外的

.TargetPath 此时是意外的

我想获取任务栏文件夹中所有快捷方式的目标。我在 .bat 文件中运行以下代码

@ECHO OFF
FOR %%i IN ("C:\Users\kirti\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\*.lnk") DO (
powershell $sh = New-Object -ComObject WScript.Shell
powershell $target = $sh.CreateShortcut('%%i').TargetPath
powershell echo $target
)

并且它给我错误说.TargetPath此时是意外的。

答案1

您调用了 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}"

三个变体的示例输出相同:

> 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

相关内容