我想获取任务栏文件夹中所有快捷方式的目标。我在 .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