digamos que eu tenha um myScript.ps1
arquivo que em algum momento precisa executar comandos/binários nativos. seu conteúdo é:
set-content -path "c:\temp\test.text" -value "hello world"
. 'C:\temp\myCliTool.exe'
Se eu criar manualmente uma tarefa no agendador de tarefas e definir as guias "ações" para
- programa/arquivo para
"C:\Program Files\PowerShell\7\pwsh.exe"
- Argumento para
-NoProfile -ExecutionPolicy Bypass -command "& {. 'C:\temp\myScript.ps1'}"
O script ps1 roda bem, o test.txt
arquivo é criado. Além disso, o comando nativo que ele precisa para executar completamente sua tarefa é executado
Mas se eu executar o mesmo script, novamente via agendador de tarefas, mas na aba "ações", faço uma pequena alteração:
- programa/arquivo para
"C:\Program Files\PowerShell\7\pwsh.exe"
- Argumento para
-NoProfile -ExecutionPolicy Bypass -file 'C:\temp\myScript.ps1'
O script não parece rodar. O test.txt
arquivo não é criado. Além disso, o comando nativo não roda.
Esse problema não ocorre se eu tentar executar o pwsh por outros meios, por exemplo, cmd.
Estou pensando que o agendador de tarefas está com defeito aqui. Passei o dia todo consertando seus "recursos", como a variável Path Env não estar disponível em chamadas do agendador de tarefas. Tentar descobrir o problema das -file
chamadas pwsh provou ser infrutífero, tentei redirecionar erros potenciais que podem ocorrer no script do PowerShell para um arquivo de texto, mas não consegui descobrir isso completamente.
Estou no pwsh 7.4 e windows 11
Em contextos de invocação sem shell no Windows, como o Agendador de Tarefas, a única forma de citação reconhecida é
"..."
(aspas duplas), não também'...'
(aspas simples). [1]Portanto, substitua:
com:
Observação: como o caminho do arquivo específico não contém espaços , você também pode passá-lo sem aspas .
A única razão pela qual
'...'
a citação funcionou foi:foi o uso do
-Command
parâmetro depwsh.exe
, o PowerShell (Core) 7 CLI, que faz com que o valor do seu"..."
argumento fechado seja interpretado como código do PowerShell , onde'...'
aspas são reconhecidas.Por outro lado,
-File
- que não envolve a interpretação de seu argumento como código do PowerShell - aceita apenas um"..."
argumento entre - como o caminho do arquivo e, da mesma forma, reconhece apenas"..."
aspas em torno de quaisquer argumentos de passagem subsequentes.Para obter orientações gerais sobre quando usar
-Command
vs.-File
, consulte esta resposta .A propósito:
"& { ... }"
para invocar o código passado para a CLI do PowerShell por meio do parâmetro-Command
( ) - basta usar diretamente. Versões mais antigas da documentação da CLI sugeriram erroneamente que isso é necessário, mas isso já foi corrigido.-c
"..."
& { ... }
[1] O mesmo se aplica às chamadas de
cmd.exe
.