Tarefa agendada para executar um Script do PowerShell de 32 bits com três argumentos

5

Versão TLDR

Eu preciso executar um script do PowerShell de 32 bits que use três argumentos como uma tarefa agendada no Windows Server 2008 R2 . O script inicia um FileSystemWatcher, portanto, preciso mantê-lo ativo para que ele continue escolhendo novos arquivos.

Você provavelmente deve olhar para as coisas em "Argumentos", abaixo, se estiver skendo.

Antecedentes

Eu criei um script do PowerShell que funciona bem no console do x86 PowerShell na minha caixa do Windows Server 2008 R2. Cria um FileSystemWatcher e registra uma ação para o evento de criação de arquivo. Como preciso que o FileSystemWatcher continue assistindo, preciso que o PowerShell continue em execução, não saia imediatamente após o script ser disparado:

O script usa três argumentos:

  1. O caminho para a pasta para assistir
  2. O caminho para uma pasta na qual ele moverá qualquer novo arquivo .xlsx e gravará um arquivo de texto de saída com base no conteúdo do arquivo .xlsx.
  3. O caminho para o arquivo de log.

No entanto, não consigo executar o script corretamente como uma tarefa agendada. Acho que o problema são os argumentos que estou usando, mas não sei quais argumentos estariam corretos.

Configuração

Como preciso que o script seja executado no PowerShell de 32 bits, defino o programa da tarefa agendada como% SystemRoot% \ syswow64 \ WindowsPowerShell \ v1.0 \ powershell.exe.

Certifiquei-me de definir a Política de Execução como RemoteSigned para a máquina local no PowerShell de 32 bits.

Argumentos

Eu tentei várias variantes diferentes para meus argumentos. O seguinte é executado no Console, mas falha de alguma forma para o Agendador de Tarefas :

A tarefa é executada, mas não grava no arquivo de log, o que indica que provavelmente nem iniciou o FileSystemWatcher. Em qualquer caso, ele não coleta arquivos quando eles são criados:

powershell -Noexit -File "D:\Scripts\myScript.ps1" "\otherServer\share\folder\subfolder\" "\someserver.domain.edu\D$\working_directory\" "\otherServer\share\folder\my_log.txt"

A tarefa sai com o código 0xFFFD0000 (consulte Último resultado de 0xFFFD0000 para a tarefa agendada do Powershell ). Tenho certeza de que a tarefa está sendo executada como a conta de serviço apropriada, que tem acesso aos compartilhamentos de rede usados nos argumentos.

powershell -Noexit -File 'D:\Scripts\myScript.ps1' '\otherServer\share\folder\subfolder\' '\someserver.domain.edu\D$\working_directory\' '\otherServer\share\folder\my_log.txt'

Essas variantes nem funcionam no console (não faça a primeira gravação no log):

powershell -Noexit -File "D:\Scripts\myScript.ps1" "\otherServer\share\folder\subfolder\ \server.domain.edu\D$\working_directory\ \otherServer\share\folder\my_log.txt"
powershell -Noexit -command {"& 'D:\Scripts\myScript.ps1' '\otherServer\share\folder\subfolder\' '\server.domain.edu\D$\working_directory\' '\otherServer\share\folder\my_log.txt'"}

Com base em Blog da Equipe de Scripts , eu pensei que deveria tentar usar o argumento -Command em vez de -File . Essas duas variantes iniciam o File System Watcher no console e gravam a mensagem correspondente no arquivo de log, mas não selecionam arquivos na criação:

powershell -Noexit -command "& 'D:\Scripts\myScript.ps1' '\otherServer\share\folder\subfolder\' '\server.domain.edu\D$\working_directory\' '\otherServer\share\folder\my_log.txt'"
powershell -Noexit -command "& D:\Scripts\myScript.ps1 \otherServer\share\folder\subfolder\ \server.domain.edu\D$\working_directory\ \otherServer\share\folder\my_log.txt"

Código

Como o script funciona no console, tenho certeza de que o problema não está no próprio código. Ainda assim, aqui estão algumas partes relevantes do próprio script para aqueles que não ficarão satisfeitos a menos que vejam o código. :)

Crie o FileSystemWatcher

Function startWatcher ($onFolder) {
    try {
        #Create a file watcher
        $filter = "*.xlsx"
        $fsWatcher = New-Object IO.FileSystemWatcher $onFolder, $filter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
        $fileWatcherStartDate = (Get-Date -format M.d.yyyy.HH.mm.ss).Tostring()
        log($fileWatcherStartDate)
        log "Started file system watcher on $onFolder for $filter files.'r'n"
        return $fsWatcher
    }
    catch {
        handleError("Error starting file system watcher")
    }
}

Registrar evento de criação

Function registerCreationEvent ($watcher) {
    log "Attempting to register creation event..."
    try {
        Register-ObjectEvent $watcher Created -SourceIdentifier FileCreated -Action {
            try {
                #Code to read from Excel file, create an output text file from the 
                #content, and move both to the specified working directory.
            }
            catch {
                handleError("Performing main action on individual file.")
            }
        }
        log "Event creation registered."
    }
    catch {
        handleError("Error registering creation event")
    }
}
    
por jonnybot 21.11.2013 / 17:26

1 resposta

3

Por George, acho que consegui!

Por fim, reverti para o modo como eu estava originalmente executando no Console (ou seja, com dot-sourcing ), mas adicionou o sinalizador -Noexit na frente:

Programa: %SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe

Argumentos: -Noexit . D:\Scripts\myScript.ps1 \otherserver\share\folder\subfolder\ \server.domain.edu\D$\working_dir\ \otherserver\share\folder\my_log.txt

    
por 21.11.2013 / 17:35