Desligue o PC em um determinado momento


1

Eu tenho um software (calibre ebook manager) que busca notícias às 6 da manhã. Eu quero fazer o seguinte:

  1. Acordar o computador às 5:50, se já não estiver ligado (facilmente feito na bios)
  2. Um agendador abre calibre às 5:55 (pronto)
  3. O Caliber busca as notícias conforme elas são iniciadas.

Os passos acima foram fáceis de realizar, mas existem alguns problemas. Eu quero desligar o pc SE E SOMENTE SE foi iniciado às 5:50 automaticamente. Se, por alguma razão, o pc já estiver ligado, NÃO QUERO desligá-lo.

Como isso deve ser feito?


2
Hack: quando o PC é inicializado, escreva um valor por meio de um script, como no horário. Salve este valor em um arquivo no seu PC. Em seguida, no momento do desligamento, verifique o valor desse arquivo e aja de acordo.
Dave

Idéia legal, escreveu um roteiro para isso, sem a necessidade de salvá-lo. :)
Charm_quark

Respostas:


2

Aqui está o AutoHotKey Script que faz isso. Certifique-se de executar este script na inicialização. (Adicione um atalho na pasta de inicialização)

;
; AutoHotkey Version: 1.x
; Language:       English
; Platform:       Win9x/NT
; Author:         AEonAX
;
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
if (A_Hour=5 and A_Min>55 and A_Min<59) ;Check if script starting time between 05:55 and 05:59 (24Hr clock)
{
Sleep,1000*60*5     ;Waits 5 Minutes
msgbox,4,,Will Shutdown in 60 seconds. Do you want to Stop the Shutdown.,60 ;Shows a msgbox for 60 seconds, If no response then shutsdown
ifmsgbox,Yes
    MsgBox Shutdown Cancelled
else
    Shutdown,1
}

3

Uma vez que a condição é para redefinir somente se o computador foi inicializado automaticamente às 5:50, eu acho que uma maneira seria confie no tempo de inicialização . Você pode ajustar o contador de minutos para detectar se, quando o BIOS iniciar o computador, às 5:50, o tempo de inicialização é visto pelo sistema. Mas isso é um detalhe.

Para o desligamento e detecção de um tempo de inicialização, você pode usar o seguinte script PowerShell:

# GETTING BOOT TIME
$last_boot_date_time = Get-WmiObject win32_operatingsystem | select @{LABEL='LastBootUpTime';EXPRESSION={$_.ConverttoDateTime($_.lastbootuptime)}}

# SELECTING HOUR:MINUTES:SECONDS PART OF THE DATE
$last_boot_time_only = $last_boot_date_time | foreach { ([String]$_).split(" ")[1] }

# CHECKING IF BOOT TIME EQUALS 05:50
# IF SO - INITIATE SHUTDOWN
if ( $last_boot_time_only.split(":")[0] -eq "05" -and $last_boot_time_only.split(":")[1] -eq "50")
{ 
    Write-host "Shutting down in 10 seconds."; 
    shutdown -s -f -t 10
}

Isto é supondo que você está usando o Windows com a versão 1 ou 2 do PowerShell. Se você tiver uma versão superior do PowerShell, talvez queira substituir o comando que obtém o tempo de inicialização com Get-CimInstance -ClassName win32_operatingsystem | select lastbootuptime


o tempo de inicialização não varia um pouco a cada inicialização?
harveyslash

Pode variar um pouco, mas a menos que você faça uma grande mudança, o quanto isso pode variar? Alguns segundos no máximo. Eu acho que é um problema menor que poderia ser corrigido com condições adicionais se.
mnmnc

0

Experimente o script em lote abaixo, depende do tempo de atividade do sistema. Execute isto quando achar apropriado, com o Scheduler

@echo off
setlocal enabledelayedexpansion

for /f "tokens=2 delims=," %%a in ('systeminfo ^| findstr Boot ^| findstr System') do (
  set output=%%a
  set /a hrs=!output:~1,1!
  set mins=!output:~3,2!
 ::echo !output!
 ::echo !hrs! 
 ::echo !mins!
if !hrs! == 5 (
    if !mins! == 50 (
        shutdown -s -f -t 100
    )
) 

)

Bem, essa é a ideia, ajustar conforme necessário

Explicação.

  1. Extraia a hora em que o computador foi ligado,

systeminfo ^ | findstr Boot ^ | Sistema findstr

systeminfo tem muita informação lá, então estamos filtrando apenas o parâmetro que precisamos que estamos procurando. por exemplo,

C: \ Usuários & gt; systeminfo | findstr Boot | findstr System

Tempo de inicialização do sistema: 12/4/2014, 7:20:37 AM

  1. Selecione o campo de hora apenas separado pela vírgula

para / f "tokens = 2 delims =," %% a em ('systeminfo ^ | findstr Boot ^ | findstr System') do (         definir saída = %% a

e nessa string inteira apenas selecione o primeiro caractere (1 espaço), o terceiro e o quarto caractere (2 espaços)

set / a hrs =! saída: ~ 1,1!   set mins =! saída: ~ 3,2!

Para dar apenas a hora e o minuto

  1. Se função para desligar se o tempo é uma correspondência.

se! horas! == 5 (

  if !mins! == 50 (

      shutdown -s -f -t 100

PS: O abaixo é o comentário para ver, se houver algum erro no código,

:: echo! saída!

:: echo! horas!

:: echo! min!


Se você marcar apenas um caractere em ~38,1 - Acontece por acaso também às 15:50? Apenas um pensamento :)
mnmnc

oops, você está correto .. deixe-me modificá-lo, obrigado
Charm_quark

Eu acho que ainda funcionaria, porque se o outro caractere entrar em ação, ele moveria o posicionamento de entrada e não corresponderia à função if para iniciar o desligamento.
Charm_quark

Eu não sou muito em cmd. você poderia explicar o que seu script está fazendo? Talvez adicionar comentários?
harveyslash

1
Eu modifiquei com explicações, espero que isso ajude. Copie e salve-o em um arquivo '.bat'. ;)
Charm_quark

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.