Agendador de Tarefas do Windows - executa uma tarefa uma vez por dia ao fazer logon

3

Estou tentando configurar uma tarefa de agendamento para executar um exe exatamente uma vez por dia. Eu tentei o seguinte:

Disparar diariamente 4:00 AM, "executar tarefa o mais rápido possível depois que um início programado for perdido"

Essa abordagem funciona perfeitamente se eu não tiver uma senha configurada na minha conta, nesse caso o Windows inicializa diretamente na área de trabalho - depois de um pequeno atraso, a tarefa é executada.

Quando adicionei uma senha à minha conta, a tarefa não é mais executada. No histórico de tarefas, vejo avisos sendo registrados:

Task Scheduler did not launch task "X" because user "Y" was not logged on when the launching conditions were met. User Action: Ensure user is logged on or change the task definition to allow launching when user is logged off.

Isso parece um aviso estúpido - sob as "Opções de segurança", eu tenho "Executar somente quando o usuário está conectado" selecionado. Por que o Agendador de Tarefas está tentando iniciar a tarefa antes do logon do usuário?

Acione diariamente às 4h e "ao fazer o login", execute o mais rápido possível

Essa abordagem não teve o efeito que eu pretendia, ou seja, eu queria que ambas condições fossem verdadeiras, ou seja, se "depois das 4:00 AM diariamente" fosse verdadeira e "log on" fosse verdadeira, então a tarefa; e para cada evento de "logon" sucessivo daquele dia, o "depois das 4:00 da manhã diariamente" não será verdadeiro, por isso, aguardará o dia seguinte. Infelizmente, não é assim que o Agendador de Tarefas funciona e, com essa abordagem, a tarefa é executada após cada logon.

Executar se o usuário está conectado ou não

Não consigo usar essa abordagem porque o exe que estou tentando executar às vezes requer entrada do usuário quando ele é concluído. Em geral, há vários motivos pelos quais uma pessoa pode não conseguir usar essa opção.

Outras opções

No campo de soluções desesperadas, estou pensando em escrever um script em lote que será gravado em um arquivo e será capaz de detectar se já foi chamado antes.

Certamente, deve haver uma maneira melhor de alcançar esse caso de uso de agendamento aparentemente comum e simples?

    
por Jim 01.02.2016 / 19:27

2 respostas

1

Run a task once a day at log on

I am trying to set up a schedule task to run an exe exactly once a day.

I am considering writing a batch script that will write out to a file and be able to detect if it's been called before.

Ok, o seguinte é um exemplo com uma lógica de script em lote muito básica e simples, como você afirmou no comentário, pode ser útil no seu caso por problemas que você está enfrentando.

Também vou referenciar outro post (no final desta resposta) no Agendador de Tarefas com o método getcha, etc. para o caso de problemas com o Agendador de Tarefas não funcionarem como esperado ao executar o script em lote. Mesmo que as opções escolhidas especificamente na configuração possam ser diferentes, assim como o sistema operacional, as pegadinhas nesse nível provavelmente são as mesmas, então dê uma olhada rápida nesse post também se você tiver problemas com o agendamento em lote com o Agendador de Tarefas não funcionando como esperado.

Divisão básica de script

  • O loop FOR /F cria a variável YYYYMMDD a ser usada na data atual.

  • O CheckDir é um caminho de unidade local ou até mesmo um caminho UNC de \servername\sharename\folder que você colocará esse pequeno arquivo de verificação com a parte YYYYMMDD de seu nome de arquivo a cada dia.

    • Basta alterar o C:\Path ou conectar o caminho UNC para onde isso precisa apontar no seu ambiente
  • O checkfile é APENAS o nome do arquivo com o %CheckDir%\ na frente dele e o %DT% anexado ao final dele antes da extensão .txt. Por exemplo, você obterá um resultado final de C:\Path\VersionBackup_20130202.txt para hoje, como no meu exemplo.

    • Isso essencialmente verificará se o arquivo existe para hoje, se assim for, termine o script, se ele não existir, crie-o e execute o VersionBackup.exe de qualquer nome do EXE. Dessa forma, isso poderia ser agendado com o Agendador de Tarefas para uma vez por hora apontando para o script em lote e pela lógica do script em lote, ele só poderá ser executado uma vez por dia.
  • O START "" "C:\Path\VersionBackup.exe" precisa apontar para o caminho completo onde existe o nome do EXE que executa a operação de backup de versão.

Exemplo de script em lote

@ECHO ON

:::: SET YYYYMMDD format for date
FOR /F "TOKENS=2-4 DELIMS=/ " %%A IN ("%DATE%") DO SET "DT=%%C%%B%%A"

:SetCheckFile
SET CheckDir=C:\Path
SET checkfile=%CheckDir%\VersionBackup_%DT%.txt
IF NOT EXIST "%CheckDir%" MD "%CheckDir%"
IF EXIST "%checkfile%" GOTO EOF
ECHO Creating the check file for date %DT% to ensure only one Version Backup run for the day>>"%checkfile%"

:StartApp
START "" "C:\Path\VersionBackup.exe"
GOTO EOF
por 02.02.2016 / 08:58
0

Elimine o arquivo .exe em uma das seguintes pastas para executá-lo quando o computador for inicializado. Você não precisará fazer nada no Agendador de Tarefas.

Apenas para o usuário atual:

C:\Users\username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

Para todos os usuários:

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

Espero que isso ajude!

    
por 02.02.2016 / 04:19