限制PowerShell中.exe的使用时间[复制]

6l7fqoea  于 2022-11-10  发布在  Shell
关注(0)|答案(2)|浏览(150)

这个问题在这里已经有答案

How do I write the value of a single property of a object?(2个答案)
两小时前就关门了。
两天来,我一直在寻找一个可以限制我玩游戏时间的软件(或者使用任何程序),但我发现没有任何有用的东西,所以我决定把我6年前的编码斗篷放回原处,自己编程。
一位朋友向我推荐了PowerShell,认为这是最简单、最快的方法。我对PowerShell一无所知,但我得出了这样的结论:

gps | ? { $_.MainWindowTitle }

我检查正在运行的进程。然后用一个if子句定义游戏是否正在运行,如果它正在运行,我使用

$StartTime = Get-Process processOfTheGame | select starttime

知道比赛是什么时候开始的。然后我应该使用另一个if子句将其与实际日期进行比较

Get-Date

但我发现了一些问题,将其与Get-Process Process OfTheGame|SELECT StartTime数据类型为PSCustomObject进行比较,因此当我尝试将格式更改为datetype时,它会抛出错误。

所以我需要帮助将$StartTime变量转换为日期类型,然后将其与实际日期进行比较。如果实际日期是2,超过$StartTime,则用以下命令结束程序

Stop-process -name GAME

我试过的东西

$testConversion = [datetime]::ParseExact($StartTime, 'dd/MM/yyyy' ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest
[datetime]::parseexact($StartTime, 'dd-MMM-yy', $null)
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest
$Date = get-date $StartTime -Format "dd-MM-yyyy"
+                      ~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-Date], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.GetDateCommand
PS> $Obj = ((get-date "10/22/2020 12:51:1") - (get-date "10/22/2020 12:20:1 "))

我试着用“扁平”约会,因为它应该是这样的,但它不是这样的。它既不能与变量StartTime一起使用

PS> $Obj = ((get-date "10/22/2020 12:51:1") - (get-date "10/2 ...
+                               ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-Date], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.GetDateCommand
oxcyiej7

oxcyiej71#

您可以使用[System.Diagnotics.Stopwatch]来启动秒表,并与TimeSpan对象比较所经过的时间。但还有一种简单得多的方法:


# Specify process name

$processName = 'gameXy.exe'

# Specify your game time in hours

$timeSleep = 2

# wait until process gets started

do {
    start-sleep -Seconds 1
}
until (gps | ? {$_.MainWindowTitle -and $_.processName -eq $processName})

# wait

Start-Sleep -Seconds ($timeSleep * 3600)

# kill process

Stop-Process -Name $processName

这将持续运行,直到检测到该进程->在指定的时间量之后终止该进程。

rur96b6h

rur96b6h2#

您非常接近从Get-Process获取DateTime对象。下面是我的系统中的一个示例(我正在运行多个note pad.exe示例,因此$Times是一个数组)。

PS C:\> $times =(get-process -name notepad | select starttime)
PS C:\> $times[0].starttime

Wednesday, November 9, 2022 08:22:07 PM

PS C:\> $tmp = $times[0].starttime;
PS C:\> $tmp.gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     DateTime                                 System.ValueType

相关问题