在Windows

时间:2016-12-17 19:21:53

标签: python windows command-line

我正在尝试在运行python客户端程序的Windows机器上运行命令。它需要在执行命令之前将值返回给服务器。

def shutdown():
    if OS_LINUX:
        os.system("sleep 10s && sudo shutdown &")
    elif OS_WIN:
        os.system(<What to put HERE>)
    return (1,"Shutting down")

如您所见,unix命令工作得很好。

在后台,它运行睡眠10秒,然后完成后,它会运行sudo shutdown。允许该函数正确返回,服务器会注意到客户端正在关闭之前&#34; sudo shutdown&#34;跑了。

然而,在窗口方面,我似乎无法在延迟后运行shutdown -s并在后台运行它。

这是我到目前为止所做的:

start /b /wait timeout 10 && shutdown -s

我尝试了很多变体:with / without / wait和/ b,使用ping而不是timeout,将ping / timeout的输出发送到&#34;&gt; nul&#34;等等。

这个是最接近我想要的,但是超时会占用命令行直到完成,这不允许我的return语句在shutdown()之前被覆盖&#34; shutdown - S&#34;运行。这使服务器挂起,直到它超时,这不是我希望用户看到的,特别是因为我不能保证客户端在服务器告诉它的同时没有松动连接关机。

我可以通过抛出&#34; timeout 10&amp;&amp; amp;来解决这个问题。 shutdown -s&#34;在批处理脚本中并使用os.system(&#34; start / b shutdown_script.bat&#34;)在后台运行该脚本,但由于分发原因,此客户端程序只需要一个可移植文件。

解决方案在unix上很容易,我在dos上缺少什么?

编辑:运行os.system(&#34; shutdown -s&#34;)命令(至少在win10上)会向用户显示一个屏幕,说明系统将关闭。这允许我的功能正常工作并将值返回给服务器。对于像hibernate这样的其他命令(&#34; shutdown -h&#34;)并不是这种情况,也不一定是旧版Windows的情况。其他命令仍然存在问题,例如远程关闭客户端程序。

EDIT2:我还需要为hibernate和logoff运行命令。分别关闭-h和-l。 shutdown的-t参数仅适用于-s和-r(至少在Windows 10上)

3 个答案:

答案 0 :(得分:0)

这个命令对我来说很好用:

shutdown /t 10 /s

答案 1 :(得分:0)

因此,我将命令窗口显示为超时,并且一旦计时器启动,您希望SHUTDOWN命令执行并退出。这就是我要做的事情:

echo off
goto :a
cls

:a
cls
timeout 10 
cls

:b
cls
shutdown -s >nul 
cls

如果您想要更快的版本,您也可以使用此命令:

shutdown /t 10 /s

答案 2 :(得分:0)

我最终使用schtasks解决了这个问题,因为shutdown只支持/ s和/ r的超时。

python代码向当前时间添加1分钟的偏移量(schtasks在几秒钟内没有处理),然后用/ f参数调用os.system(“schtasks .....”)以避免schtasks阻塞控制台要求ay / n覆盖。

def get_time_offset(offset):
    now = datetime.datetime.now()
    offset_now = now + datetime.timedelta(minutes=offset)
    offset_now_time = offset_now.time()
    future_time = (str(offset_now_time.hour) + ":" + str(offset_now_time.minute) + ":" + str(offset_now_time.second) )
return future_time

def sch_task(name, time, task):
    os.system("schtasks /create /tn \"" + str(name) + "\" /sc once /st " + str(time) + " /tr \"" + str(task) + "\" /f")

最终通话如下:

sch_task("client_hibernate", get_time_offset(1), "shutdown /h")

在通话结束后1分钟运行。

这个解决方案唯一的问题是schtasks只有一分钟的精度,所以你不能在将来安排任务不到一分钟。

我可能会在python中编写一个多线程计时器来运行命令,而不是依赖于schtasks for windows和sleep for linux。