标题: [问题求助] 求助,在powershell脚本中如何捕获命令行的输出 [打印本页]
作者: g495326 时间: 2022-10-31 16:42 标题: 求助,在powershell脚本中如何捕获命令行的输出
本帖最后由 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
- }
复制代码
作者: zaqmlp 时间: 2022-10-31 17:37
- $p='';
- $process=New-Object System.Diagnostics.Process;
- #$process.StartInfo.WindowStyle=[System.Diagnostics.ProcessWindowStyle]::Hidden;
- $process.StartInfo.UseShellExecute=$false;
- $process.StartInfo.RedirectStandardOutput=$true;
- $process.StartInfo.FileName='E:\Shortcut.exe';
- $process.StartInfo.Arguments='/F:"'+$_+'" /A:Q';
- [void]$process.Start();
- $result=$process.StandardOutput.ReadToEnd();
- $m=[regex]::match($result, 'TargetPath=([^\r\n]+)');
- if($m.Success){$p=$m.groups[1].value;}
- $process.WaitForExit();
- $process.Dispose();
复制代码
作者: g495326 时间: 2022-11-1 09:15
回复 2# zaqmlp
多谢,解决了我的问题。已发支付宝
作者: 5i365 时间: 2022-11-1 10:40
本帖最后由 5i365 于 2022-11-1 10:41 编辑
多分解一行应该可以:
- $a = cmd.exe /c "E:\Shortcut.exe" /F:$_ /A:Q
- $OutputVariable = $a | findstr TargetPath= | Out-String
- $OutputVariable.Substring(11)
复制代码
________________________________________________
下面测试能过:
- $p = "$HOME\Desktop\word.lnk"
- $a = cmd.exe /c "E:\Shortcut.exe" /F:$p /A:Q
- $OutputVariable = $a | findstr TargetPath= | Out-String
- $OutputVariable.Substring(11)
复制代码
作者: g495326 时间: 2022-11-1 15:34
回复 4# 5i365
谢谢你的回复,这样是报错的
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |