Windows similar ao comando * nix “at”

2

* nix possui o comando "at", que pode ser canalizado para executar um programa em um determinado momento. Assim:

echo "SOME_COMMAND" | at 00:00

O Windows também possui um comando "at", que cria uma tarefa agendada uma vez executada que é executada em segundo plano pelo SISTEMA do usuário. "schedtasks" é mais completo, mas também um pouco trabalhoso (especialmente porque requer um nome exclusivo para cada tarefa, a ideia de criar um lote para criar um estilo * nix para executar uma tarefa a fim de imitar o "at" do * nix torna-se um pouco impraticável).

Então, existe um utilitário para o Windows que faz o que o * nix "at" faz, de uma maneira simples e sem complicações?

UPDATE: serei mais específico agora =). Eu estou tentando desligar meu monitor em um determinado momento, e eu uso um utilitário de linha de comando chamado nircmd para que eu possa simplesmente digitar "nircmd monitor off" para fazer o trabalho. Se eu usasse o Linux neste computador, tudo que eu tinha que fazer era

echo "nircmd monitor off" | at XX:YY

ou crie uma "macro". Mas no Windows eu só tenho as tarefas agendadas, o que é uma maneira bastante burocrática de criar uma tarefa de executar uma vez, já que "at" realmente não funciona (veja minha pergunta semelhante Agendador de Tarefas do Windows e possíveis problemas de permissão ) e" schedtasks "exigem o nome exclusivo do item mencionado acima.

Sendo um programador, deve ser fácil criar um programa que imite o "at" do Unix. Mas eu queria ter certeza de que não estava reinventando a roda primeiro.

    
por Rafael Almeida 14.07.2010 / 05:03

5 respostas

3

Então, aqui está como eu consegui resolver o problema. Eu criei um arquivo .bat chamado killscreenat.bat e coloquei em / Windows / system32 (mas você pode, obviamente, colocá-lo em qualquer lugar - ou em qualquer lugar que esteja em seu PATH). O script é simples:

schtasks.exe /create /SC ONCE /TN poweroffmonitor /TR "nircmd monitor off" /ST %1 /F

E o uso é simples:

killscreenat HH:MM

A chave era a opção (strongmente não / documentada incorretamente) / F. Embora isso não seja dito no doc do Technet (ou em qualquer outro lugar que eu tenha lido), ele força o Scheduled Tasks a sobrescrever a tarefa criada, se já existir.

Não é uma solução global - o que significa que você não pode simplesmente "canalizar" qualquer comando para ela, mas se a sua "tarefa" é frequente como a minha, o processo é bastante fácil.

Obrigado a todos pelas respostas, eles realmente ajudaram a encontrar a solução final!

    
por 15.07.2010 / 18:17
2

Você já tentou CygWin um shell bash dentro do Windows?

    
por 14.07.2010 / 20:43
1

Existem vários sinalizadores no comando at do Windows, que permitem configurar tarefas repetitivas e interativas, apenas em --help para a lista completa. Para mim, parece que você está atrás de uma combinação de / every: e / interactive, mas não tenho certeza do que exatamente você está tentando alcançar.

    
por 14.07.2010 / 10:58
1

Tarefas agendadas em computadores desktop do Windows (não em edições de servidores, parecem ok) estão na minha experiência completamente não confiáveis e ainda não funcionam no Windows 7. Você descobrirá que cria tarefas que funcionam por um tempo e depois de repente, não por nenhuma razão que você possa determinar.

Você provavelmente terá problemas de permissão com algum tipo de AT se estiver tentando usá-lo no Windows Vista / Windows 7, já que precisa executar um prompt de comando elevado para acessar o comando.

O que você está tentando alcançar? É possível que você possa implementar seu próprio agendador ou usar outra ferramenta de terceiros?

    
por 14.07.2010 / 12:47
1

Bem, eu uso esse método burro:

: label1
if "% time%" GTR "15: 00: 00,00" do (do coloque seus comandos aqui
goto label2
)
goto label1
: label2

    
por 14.07.2010 / 19:38