Preciso configurar uma tarefa agendada do Windows. Ele aceita 1 parâmetro / argumento, que é um caminho e pode conter espaços. Minha tarefa agendada não funciona - ela "quebra" o parâmetro no primeiro espaço.
Se eu executá-lo no prompt de comando, posso apenas envolver o argumento em "" e ele funciona bem, no entanto, isso não funciona na interface do usuário da tarefa agendada.
por exemplo C:\Program Files\xyz\FTP File Transfer\FTPFileTransferTask.exe "C:\Program Files\xyz\The Interface\Folder Path"
Tentei agrupar o argumento com "" '' [] () e tentei preencher os espaços com% 20, ~ 1 etc. sem sorte.
Conheço uma solução para criar um arquivo bat e usar "" em torno do meu argumento, mas não quero adicionar mais complexidade.
Eu tentei no Windows 7 e Windows 2008 Server e ambos falharam. Parece não haver discussões sobre isso?
fonte
Respostas:
Eu trabalhei com tarefas agendadas e você geralmente coloca os argumentos em sua própria caixa de entrada de texto. Isso significa que você aponta a ação para o campo de programa / script, aponta para o exe e o campo "Adicionar argumentos" deve ter todos os parâmetros. ( fonte )
Acredito que esse comportamento foi adicionado para impedir que espaços no caminho do arquivo para o exe causem problemas.
Faço isso o tempo todo com scripts do PowerShell. Aqui está um exemplo:
fonte
Observe o uso de
'
no caminho de um arquivo a ser executado.fonte
Nesse caso, você pode solucionar o problema passando o parâmetro path no formato 8.3.
Você pode descobrir o formato 8.3 para o seu caminho abrindo um prompt de comando e emitindo o comando
dir /x
na raiz da sua unidade.Você deve ver uma entrada semelhante a
para o diretório Arquivos de Programas.
Em seguida, altere o diretório para Arquivos de programas com
cd "Program Files
"seguido de cd xyz e emitadir /x
novamente para encontrar o nome do formato 8.3 para" A interface "e assim por diante.Seu caminho final para o exemplo que você deu seria algo como:
fonte
Eu tive um problema semelhante com o VLC, que estava usando no Windows XP. O truque é colocar o argumento do
cmd
comando entre aspas duplas.Aqui está um exemplo do que eu usei (agendando uma gravação às 15:00):
Observe o uso de aspas duplas logo após
/c
e no final do comando (depois.mpg
). O argumento com espaços neste caso é"C:\Documents and Settings\..."
fonte
Uma maneira de conseguir isso é usar o PowerShell na linha de comando.
Adicione esse código a um arquivo chamado MyModule.psm1.
Em seguida, na linha de comando OU em um arquivo ps1, você pode executar:
Cada item respectivo na matriz de parâmetros da tarefa seria passado como $ (Arg0), $ (Arg1) e $ (Arg2).
fonte
Defina sua tarefa agendada da seguinte maneira
cmd / c C: \ Arquivos de programas \ xyz \ Transferência de arquivos FTP \ FTPFileTransferTask.exe "C: \ Arquivos de programas \ xyz \ O caminho da interface \ pasta"
fonte
Pode ajudar a entender o problema de uma perspectiva diferente. Digamos que você seja o programador encarregado de adicionar um agendador de tarefas ao Windows. Como você faria? Você tem vários problemas para enfrentar: Se a tarefa for executada como alguém que não seja o usuário conectado, você deve incomodar o usuário conectado com algum erro de pop-up? E se não houver usuário conectado no momento em que a tarefa for executada? E a diferença entre um programa GUI e um programa de console? As GUIs não possuem stdin, stdout e stderr; o conceito não tem sentido neles. E os programas internos ou externos ao COMMAND.COM/CMD.EXE? Ou outros mecanismos de script? E os caminhos com espaços no nome do comando? Ou nos parâmetros (opções / argumentos)? (Como você está tentando lidar agora ..)
Embora eu não tenha 100% de certeza sobre os detalhes internos ou técnicos completos neste caso, as respostas parecem ser .. As tarefas são executadas em uma sessão isolada e não interativa, que não pode interagir com o usuário conectado no momento (se houver) ); É executado esperando que não haja saída do console, uma vez que não é interativo, não pode simplesmente interromper qualquer usuário conectado para mostrar a saída de qualquer maneira (e se houver saída, stdin é o bitbucket / NULL, stdout e stderr são registrados no o recurso de registro do sistema); Os espaços são tratados ignorando o problema: o nome do comando é obtido EXATAMENTE como está e os parâmetros passados para o comando são especificados em outra caixa de entrada nas propriedades da Tarefa.
Todos os meios são que sua tarefa precisa ser executada como se fosse um daemon (no mundo Un * x). Tudo é estático e preciso. O nome do comando é o nome do comando real, sem nenhum parâmetro. Isso geralmente inclui a execução de intérpretes de comando / script, como o CMD.EXE! Os parâmetros, se houver, são especificados em outro lugar e devem ser conhecidos quando você configura a tarefa (ou seja, não é possível alterar os parâmetros "on-the-fly"). E assim por diante.
Portanto, se você deseja incluir parâmetros, é necessário usar a seção de parâmetros para especificar os parâmetros. O Agendador de tarefas nãotente analisar o nome do comando para dividi-lo em "command" e "args", como fazem os programas de linha de comando. Apenas o trata como um grande nome completo de comando. Da mesma forma, se você deseja parâmetros variáveis, como usar% 1 ..% n em arquivos BATCH, não pode fazê-lo no próprio Agendador de tarefas; Você terá que encontrar outro caminho. (Observe que você também não pode usar variáveis de ambiente, pois o ambiente passado para o programa depende do ambiente em que a tarefa foi iniciada, NÃO do ambiente "atual".) Você pode usar um arquivo temporário para salvar os parâmetros, mas desde que você deve especificar um nome de arquivo estático nas propriedades da tarefa, o que acontece quando você está em uma rede com 5000 usuários e quatro deles tentam executar a mesma tarefa ao mesmo tempo? Todos eles se atrapalham tentando gravar no mesmo arquivo temporário ao mesmo tempo, provavelmente também não é o que você queria. (Existem soluções para esse problema também, mas isso está muito além do escopo desta pergunta e resposta ..)
Resposta final: no caso simples - o caminho que você deseja passar como parâmetro é estático e não muda - é necessário especificar os parâmetros na propriedade Task apropriada (Arguments), em vez de na caixa Program / Script ou use um arquivo em lotes. Em um caso mais complexo - você precisará fazer a pergunta certa ou pesquisar como os daemons funcionam e como usar bloqueios / semáforos e outros para comunicação entre processos (IPC).
Boa sorte.
fonte
A Microsoft possui um boletim sobre isso: https://support.microsoft.com/en-us/help/823093/a-scheduled-task-does-not-run-when-you-use-schtasks-exe-to-create -it-a
Basicamente, ele diz para usar a sequência "\" antes e depois do nome do arquivo em lotes.
fonte