首页 > 学技术 > 技术网文 > Perl > 正文

[保留] 哪个模块可以更改windows的时期和时间?


来源 chinaunix.net kuqin整理

如题,要求是模块。



 superdoctor 回复于:2005-01-04 11:00:23

恕我直言,楼主的说法着实过火,论坛上其他人并没有解答你问题的义务,尽管你的问题简单


 freeand 回复于:2005-01-04 14:39:41

很抱歉!
我一心想着把问题说得简单明了,不好意思了。。。
我找过好多模块,都只是列出日期,或许是做日期的列表,好像都没法更改系统的日期和时间。。。不知谁有过经验的,麻烦说说,谢了~


 superdoctor 回复于:2005-01-04 14:49:46

引用:原帖由 "freeand" 发表:
很抱歉!
我一心想着把问题说得简单明了,不好意思了。。。
我找过好多模块,都只是列出日期,或许是做日期的列表,好像都没法更改系统的日期和时间。。。不知谁有过经验的,麻烦说说,谢了~



没关系,有问题大家帮着看一下也没有问题的

WINDOWS下的

use Win32::OLE::Variant;

my $v = Variant(VT_DATE, "April 1 99 2:23 pm");
        print $v->;Date("ddd',' MMM dd yy"), "\n";
        print $v->;Time("hh.mm.ss tt"), "\n";

输出: 

Thu, Apr 01 99
        02.23.00 PM




 freeand 回复于:2005-01-04 16:14:31

我就是这个问题啊,和你这个例子差不多,只能显示日期,不能应用修改到winxp系统啊。。。


 superdoctor 回复于:2005-01-04 16:23:45

这个我没有试过,临时找到的

那你使用system ("time xxxxxx")就可以啦在DOS/WINXP下  :roll:


 freeand 回复于:2005-01-04 16:34:26

my $cmd=`date 日期 && time 时间`;

这样是可以的。。。但是,这样在程序里调用,会弹出一个dos窗口。。。

所以,我想用模块方式实现,想避免任何窗口的弹出。。。


 freeand 回复于:2005-01-04 16:37:03

use Win32;
use Win32::Process;
$CreateOptions=NORMAL_PRIORITY_CLASS | DETACHED_PROCESS;
Win32::Process::Create($ProcessObj,'C:\WINDOWS\system32\cmd.exe',"cmd time 时间",0,DETACHED_PROCESS,".");
$ProcessObj->;Wait(INFINITE);
$ProcessObj->;GetExitCode($ExitCode);

这样也不行~~~


 superdoctor 回复于:2005-01-04 17:04:33

WINDOWS确实比较讨厌,你到其他WINDOWS的论坛去问问,这里是CHINAUNIX,老实说大家的WINDOWS经验不是太丰富的 :lol:


 freeand 回复于:2005-01-04 17:26:26

:oops: 关于perl的论坛越来越少了。。。哎~


 flw 回复于:2005-01-04 18:33:35

引用:原帖由 "superdoctor"]WINDOWS确实比较讨厌,你到其他WINDOWS的论坛去问问,这里是CHINAUNIX,老实说大家的WINDOWS经验不是太丰富的 :lol:
 发表:

不许撵人家走!
楼主别灰心,
让我帮你去试试, 看有没有什么好办法.


 freeand 回复于:2005-01-04 18:47:39

引用:原帖由 "flw" 发表:
恍砟烊思易?
楼主别灰心,
让我帮你去试试, 看有没有什么好办法.



 :em16: 谢谢!


 superdoctor 回复于:2005-01-05 10:54:49

引用:原帖由 "flw" 发表:
恍砟烊思易!

楼主别灰心,
让我帮你去试试, 看有没有什么好办法.



知道了,大人

目前确实没有好的办法去找到一个摸块,刚在turbo c下给你拼了一个


/*******************************************************************/
/*FUNCTION:                                                        */
/*   Change date and time under windows platfarm and avoid DOS     */
/*   prompt                                                        */
/*                                                                 */
/*USAGE:                                                           */
/*   "a.out 0 2005-01-05" to change current date to 20050105;      */
/*   "a.out 1 12:00:00" to change time time to 12:00;              */
/*                                                                 */
/*   Use Perl system function when call this program under perl    */
/*   scripts,and will not pop_up DOS prompt;                       */
/*******************************************************************/

#include <stdlib.h>;

#define DATE 0
#define TIME 1

int main(int argc, char *argv[])
{
   char cmd[50];
   int ret,cmdtype;
   
   if(argc < 3)exit(-2);
   memset(cmd,0,50);  
   cmdtype=atoi(argv[1]);
   if( cmdtype == DATE)
   {
      strcpy(cmd, "date ");
      strcat(cmd,argv[2]);
      ret = system(cmd);
      return(ret);
   }
   if( cmdtype == TIME)
   {
      strcpy(cmd, "time ");
      strcat(cmd,argv[2]);
      ret = system(cmd);
      return(ret);
   }  
}


临时解决办法吧


 bytewolf 回复于:2005-01-05 12:08:32


use Win32::Job;
   
my $job = Win32::Job->;new;
   $job->;spawn("cmd", q{cmd /C "date 2005-01-06"});
   $job->;spawn("cmd", q{cmd /C "time 12:07:12"});
   $job->;run(10);



 superdoctor 回复于:2005-01-05 13:03:48

bytewolf,你的这个会不会弹出dos窗口?


 freeand 回复于:2005-01-05 14:39:35

引用:原帖由 "bytewolf"]
 发表:



有两个窗口弹出来。。。


 bytewolf 回复于:2005-01-05 20:40:53

奇怪了...在我的winxp上,除了运行该程序打开的一个cmd窗口外,运行中不会再弹出新的窗口啊....


 flw 回复于:2005-01-05 21:06:52

折腾了一晚上,终于搞定楼主的问题了:
#!/usr/bin/perl -w

# 2005.01.05 习作于武汉 writed by flw

use strict;
use Win32::API;
use Tk;

my $ret;

Win32::API::Struct->;typedef( 'TIMESTRUCT' =>; qw(
    WORD wYear; 
    WORD wMonth; 
    WORD wDayOfWeek; 
    WORD wDay; 
    WORD wHour; 
    WORD wMinute; 
    WORD wSecond; 
    WORD wMilliseconds; 
    ) ) || die "typedef struct TIMESTRUCT failed: [$!]\n";

$ret = Win32::API->;Import( 'Kernel32.dll', 'VOID GetLocalTime( LPTIMESTRUCT time )' );
die "Import Win32API GetLocalTime failed: [$!]\n" unless $ret;
$ret = Win32::API->;Import( 'Kernel32.dll', 'BOOL SetLocalTime( LPTIMESTRUCT time )' );
die "Import Win32API SetLocalTime failed: [$!]\n" unless $ret;

my $win = new Tk::MainWindow( '-title' =>; 'flw' );
my $labelText = 'Press OK to set local time';
$win->;Label( '-textvariable' =>; \$labelText )->;pack();
$win->;Button( '-text' =>; 'OK', '-command' =>; \&OnOK )->;pack();

sub OnOK{
    my $timeVar = Win32::API::Struct->;new( 'TIMESTRUCT' );
    $timeVar->;align(0);
    GetLocalTime( $timeVar );
    $timeVar->;{ 'wYear' } = 2005;
    $timeVar->;{ 'wMonth' } = 1; 
    $timeVar->;{ 'wDay' } = 23; 
    my $ret = SetLocalTime( $timeVar );
    $labelText = "ret: [$ret]  ".($ret ? 'success' : "failed: [$!]");
}

MainLoop();



 flw 回复于:2005-01-05 21:10:40

主要思路是利用 Win32::API 模块来调用 windows SDK 提供的功能,
按照这个思路可以调用所有的 SDK API。

至于怎么不弹出窗口来,
我想用 CreateProcess 应该可以的。
system 肯定是不行的,因为 system 要激活一个 cmd 进程。
我用 WinExec( "cmd /c date 2005-01-20", SW_HIDDEN ) 试过,按思路讲应该是可以实现的,不过始终报错“找不到命令文件”,不知道是我哪里搞错了,改天再折腾折腾。


 flw 回复于:2005-01-05 21:12:58

Win32::API 可以用 ppm 下载下来。

哈哈!现在我总算是基本掌握了扩展 Perl 和嵌入 Perl 两种技术。
从而可以实现 Perl/C 混合编程了。


 freeand 回复于:2005-01-05 21:59:57

谢谢flw!!!!!成功啦~~~


 superdoctor 回复于:2005-01-06 11:58:17

引用:原帖由 "flw" 发表:
Win32::API 可以用 ppm 下载下来。

哈哈!现在我总算是基本掌握了扩展 Perl 和嵌入 Perl 两种技术。
从而可以实现 Perl/C 混合编程了。



flw确实强

建议加精,这个例子对WIN下vs的程序员平滑过渡到perl程序员非常有启发意义啊

加精吧,flw


 flw 回复于:2005-01-06 19:25:47

to 楼上:
我正准备等融会贯通之后,写一些 Perl/C 混合编程的系列文章呢。
我准备分成三部分:
1,利用 C 语言编制模块来扩展 Perl 的功能。
2,在 Perl 中调用 C 语言书写好的动态/静态链接库(就是这个帖子中的例子了)
3,在 C 语言中嵌入 Perl 解释器
大家也可以考虑考虑。

至于加精华,因为我说过是不要精华的,所以就暂时先不加了。


 freeand 回复于:2005-01-07 10:29:11

http://www.chinaunix.net/forum/viewtopic.php?t=474265&show_type=&sid=003f38f0d1e5e74cfd3ef66cd0ea7326

请问如何改啊?或者有什么更好的可以用在linux和windows下的定时器?谢谢了~


 superdoctor 回复于:2005-01-07 10:51:13

引用:原帖由 "flw" 发表:
to 楼上:
我正准备等融会贯通之后,写一些 Perl/C 混合编程的系列文章呢。
我准备分成三部分:
1,利用 C 语言编制模块来扩展 Perl 的功能。
2,在 Perl 中调用 C 语言书写好的动态/静态链接库(就是这个帖子中..........



有一本书叫做<Perl 语言技术内幕>;,有中译本卖,里面有比较详细介绍PERL与C协同的章节,呵呵,我有这本书,但是没有电子版的,不然就共享出来了




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=476152
转载请注明作者名及原文出处



收藏本页到: