PowerShell实现时间管理小秘书

2019-09-30 11:13:22刘景俊

--              ----            -----      -----------     --------

5               Job5            Running    True            localhost

而在此过程中,我们可以通过get-content d:temptimeRecord.txt命令来了解时间使用情况。也可以用job管理命令如stop-job来停止任务,get-job来观察任务,receive-job来接收输出等。

等下等下,不对呀,我们难道不能直接显示$record吗?让我们来试一下。键入$record,回车,咦?怎么没有结果?

这是因为PowerShell这种脚本语言中变量也是有作用范围(scope)的。脚本中的$record只在脚本中有效,我们在全局(global)范围内当然就看不到它啦。可是脚本就不能写入全局变量了吗?当然可以。我们可以将调用命令做一点小小的改动,变成. c:usersgrapeotMonitor.ps1,注意前面的这个点和空格,以及这里暂时没有用start-job而是直接执行。等运行一会以后按Ctrl+C结束脚本,键入$record看看,结果出来了吧~这个". "叫做dot sourcing,利用它我们可以让脚本或函数直接读写全局变量。当然还有一种方法是用set-variable命令加上-scope参数来读写。具体使用方法可以用help set-variable -parameter scope命令查询。

但是这两个特性在后台job中似乎有点失效。如果用dot sourcing启动脚本的话这个job直接就吊死了,状态是Running但实际上得不到运行。Microsoft说这是由于叉叉过程造成死锁捣的鬼。如果用set-variable对全局变量赋值的话还是无法用$record观察到结果。据推测可能是后台运行的会话和当前会话是彼此独立的,因此没有办法共享变量。看来要想在后台任务和当前会话中传递数据,还只能通过Receive-Job或者临时文件了呢。如果各位有什么高招的话还请赐教呀~

呈现与挖掘

一天结束了,我们也拿到了一个统计表,比如

Name                           Value

----                           -----

编程                           5869

文档                           3217