【发布时间】:2015-05-07 11:27:44
【问题描述】:
简介:
首先,我对一般的脚本编写非常陌生,所以我认为应该如何解决这个问题的逻辑可能存在缺陷。我正在使用 Windows Server 2012 R2,所以我认为 PowerShell 可能是解决此问题的最佳方法。
我想做什么:
将计划任务设置为每晚运行一次并调用执行以下操作的脚本:
- 检查以确保有零个活动用户登录到正在执行脚本的本地服务器
- 处于断开连接状态的用户不会被视为已登录。
- 如果活动用户为零:
- 注销任何处于断开连接状态的实际用户(不是系统进程)
- 删除 C:\MyFolder\*
- 否则,什么也不做
我的想法是我不想删除 C:\MyFolder,但我想删除其中的内容。如果处于断开连接状态的用户是拥有内容的用户,我可能无法删除 C:\MyFolder 中的内容,因此为了解决这个问题,我将它们注销(无论如何,他们不应该离开断开连接的会话)。
逻辑:
翻阅一番后,我发现qwinsta /server:localhost 似乎在为用户查询本地主机并提供这种类型的输出:
PS C:\Users\EF112131> qwinsta /server:localhost
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
console 1 Conn
AB123456 2 Disc
rdp-tcp#0 cd789101 3 Active
rdp-tcp#1 EF112131 4 Active
rdp-tcp 65536 Listen
这为我提供了我关心的已登录用户(AB123456、cd789101 和 EF112131),并检查他们会话的各自状态(Disc、Active)。我的想法是,从这里我可以拉入USERNAME 和STATE 进行某种检查。如果检查返回任何设置为Active 的STATE,则脚本将不执行任何操作并结束。如果没有Active 状态,脚本将断开任何处于Disc 状态的USERNAME,然后通过执行del /S C:\MyFolder\* 之类的操作清除C:\MyFolder 的内容
我在这里遇到的问题是我不知道如何从上述输出中提取这些值?我想这类似于awk 在 Linux 领域的情况,但我还没有弄明白。
【问题讨论】:
-
我会考虑查看我的答案here,它将 qwinsta 输出转换为 PowerShell 对象。使查询数据更容易。
标签: powershell