【问题标题】:How to hide and send keystrokes to a command prompt window using perl?如何使用 perl 隐藏击键并将其发送到命令提示符窗口?
【发布时间】:2012-07-05 18:06:48
【问题描述】:

我已经使用 Win32::GUItest 编写了一个 perl 脚本来将击键发送到 windows 中的命令提示符窗口,现在当我的脚本运行时,它使用 perl 中的系统函数并打开一个新的 cmd.exe 文件并发送击键给它。直到这里一切正常,但我不希望该命令提示符窗口可见并且用户手动运行脚本。我希望将击键发送到后台的 cmd.exe 窗口中。我想使用 schtasks 使用 windows 64 位服务器来安排脚本。

请不要建议我使用Proc::BackgroundWin32::ServiceWin32::Daemon,除非您真的尝试过这项任务,您可以使用它们。

【问题讨论】:

  • 你真正想做什么?
  • 我没有权限通过 ssh 连接到我需要从中收集日志的 linux 服务器。我在具有 cli.exe 的 Windows 服务器上安装了一个工具,我可以在其中使用来自 perl win32::guitest 的击键执行命令并收集审核日志报告,它可以正常工作并将输出文件保存在一个位置。这是手动完成的,但我想通过在安装该工具的 Windows 服务器上将其安排为 schtasks 来自动化它。仅当 cli.exe 处于活动状态时才发送击键。我希望它将击键发送到后台的 cli.exe 窗口。

标签: windows perl background


【解决方案1】:

我认为您可以使用Win32::Console 控制控制台。

我没有这方面的经验,但文档听起来很有希望:因为有一个 Display() 函数,我假设控制台默认是隐藏的。

【讨论】:

  • 我已经在我的 windows 机器上安装了 Win32::Console 并尝试使用 cpan.org 中的命令。您能否提供任何使用 win32::console 的示例链接。
【解决方案2】:

您需要向相关窗口发送WM_CHARWM_UNICHAR 消息,而不是依赖窗口处于活动状态并处于前台。

这个例子似乎对我有用。当密钥被发送到在cmd.exe 窗口中运行的links 时,我能够切换到其他应用程序。当我写完一封电子邮件时,链接已经导航到example.com

#!/usr/bin/env perl

use strict; use warnings;
use Encode qw(encode);
use Time::HiRes qw( usleep );
use Win32::GuiTest qw(SendMessage ShowWindow WaitWindow);

use constant WM_CHAR => 0x0102;
use constant SW_HIDE => 0;
use constant SW_SHOW => 5;

system qw(start links);

my $hwnd = WaitWindow('Links', 5);

ShowWindow $hwnd, SW_HIDE;

send_message($hwnd, "ghttp://example.com/\r");

ShowWindow $hwnd, SW_SHOW;

send_message($hwnd, "q\r", 3_000_000);

sub send_message {
    my ($hwnd, $msg, $delay) = @_;

    $delay ||= 25_000;
    my @keys = encode_keys($msg);

    for my $key (@keys) {
        SendMessage $hwnd, WM_CHAR, $key, 0;
        usleep $delay;
    }
    return;
}

sub encode_keys {
    my ($msg) = @_;
    map ord, map encode('UTF16-LE', $_), split //, $msg;
}

【讨论】:

  • 我尝试按原样运行上面的代码,它给我一个错误“windows 找不到链接”。
  • 非常感谢。我用 cmd.exe 替换了脚本的链接,现在它对我来说工作正常,但是我注意到 cmd.exe 窗口弹出然后隐藏。在我的脚本发送最后一个命令之前,我应该怎么做才能完全隐藏 cmd.exe,以及如何在所有命令完成后杀死窗口,以及如何在打开新的 cmd.exe 窗口时向该窗口发送消息其他一些用户在脚本运行时登录,使其独一无二。
  • 显然,您可以将cmd窗口最小化,然后将其隐藏。有一种不同的方法可以做到这一点,但它有点涉及。我已经blogged about the first step了,但剩下的要等到我完成其他项目之后。
  • 非常感谢您的帮助,同时我会尝试找出解决方案
  • 嗨思南,我正在尝试在 Windows 上使用 schtasks 安排脚本运行,当我从命令提示符以“perl script.pl”运行脚本时,它工作正常但是当我安排它时,它不管用。 schtasks /create /tn "name" /tr "D:\Audit\collectAuditLogs.pl" /sc daily /st 13:00 /ru admin 我创建了这个管理员帐户并将其添加到具有相同权限的管理员组中。您能否尝试在您的机器上安排任务并查看问题所在
猜你喜欢
  • 2015-12-11
  • 2015-09-13
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 2015-12-27
  • 2011-01-08
相关资源
最近更新 更多