本帖最后由 g495326 于 2022-10-31 17:07 编辑
以下脚本使用WScript.Shell获取的快捷方式的源文件,我想改成使用调用外部命令行的方式来实现。
但当我把19行 $p = $shell.CreateShortcut($_).TargetPath 这一行代码替换成- $OutputVariable = (cmd.exe /c "E:\Shortcut.exe" /F:$_ /A:Q | findstr TargetPath=) | Out-String
- $p = $OutputVariable.Substring(11)
复制代码 就提示找不到源文件,如果能解决,可以给与报酬
由于论坛无法上传附件,外部命令行程序Shortcut.exe见网址:https://wx.mail.qq.com/ftn/downl ... amp;fweb=1&cl=1
下面是整个脚本代码- using namespace 'Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes'
- using namespace 'System.Windows.Forms'
- using namespace 'System.Collections.Specialized';cls
- [void][System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')
- Add-Type -Name 'WinApi' -MemberDefinition '[DllImport("user32.dll")]public static extern short GetKeyState(uint VK);'
- $shell = New-Object -ComObject 'WScript.Shell'
- $paths = New-Object 'StringCollection'
- $arr_err = New-Object 'System.Collections.ArrayList'
- if([WinApi]::GetKeyState(16) -band 0x8000){ write-host 'shift';$paths = [Clipboard]::GetFileDropList() }
- $args | foreach { [void]$paths.Add($_) }
- $paths = &{
- $paths | Select-Object -Unique | foreach {
- #目录
- if([System.IO.Directory]::Exists($_)){ return $_ }
- #文件
- if([System.IO.File]::Exists($_)){
- #lnk文件
- if($_.EndsWith('.lnk')){
- $p = $shell.CreateShortcut($_).TargetPath
- if([System.IO.File]::Exists($p)){ return $p }
- if([System.IO.Directory]::Exists($p)){ return $p }
- [void]$arr_err.Add(('{0} -> {1}' -f $_,$p))
- return $null
- }
- #其它文件
- return $_
- }
- } | Select-Object -Unique
- }
- if($paths.Count -gt 0){
- [Clipboard]::SetFileDropList($paths)
- 'ok'
- $paths
- '-----------'
- }
- if($arr_err.Count -gt 0){
- 'fail'
- $arr_err
- '-----------'
- pause
- }
复制代码
|