o script do powershell aguarda a saída de impressão até que eu pressione um botão

3

Eu escrevi um script PS1 que contará quantos processos (neste caso, MS Project) estão sendo executados em um farm Citrix.

O código é:

$variable=(query farm /process | where { $_.Contains("WINPROJ") }  | measure ).count
echo $variable

Se eu executar o PS1 a partir do powershell, ele funciona perfeitamente, mas se eu invoco de cmd (para agendar) usando powershell.exe -file "C: \ foo \ countProcessProject.ps1" ou powershell.exe -c "C: \ foo \ countProcessProject.ps1" o script irá parar até que eu pressione um botão várias vezes, gerando a variável.

Eu comparei variáveis de ambiente na execução de CMD e PS e são quase as mesmas.

Cumprimenta

    
por vfondevilla 17.01.2014 / 13:38

4 respostas

1

Você pode forçá-lo a retornar usando o argumento -NonInteractive com o powershell:

PowerShell.exe -File "C:\foo\countProcessProject.ps1" -NonInteractive

Embora eu não tenha nenhuma explicação perspicaz sobre o motivo pelo qual isso seria necessário, eis como lidaria com essa questão:

Sem o PowerShell:

Se você insistir em usar a jóia arqueológica de query farm , isso pode ser feito usando cmd sozinho - sem necessidade de complicar uma tarefa simples:

query farm /process |find /i "winproj" /c

Isto produzirá o número "winproj" processa muito da mesma maneira que sua instrução de invocação do powershell atual

Usando apenas o PowerShell:

Se você está interessado em passar para uma solução mais centrada no PowerShell, é possível usar os PS Snapins incluídos no oficial XenApp PowerShell SDK da Citrix:

Add-PSSnapin Citrix.XenApp.Commands
$FarmProcs = Get-XAServer -OnlineOnly | Get-XASessionProcess
$MSProjProcs = $FarmProcs | Where {ProcessName -match "winproj"} | Measure-Object
return $MSProjProcs.Count
    
por 20.01.2014 / 23:15
0

Eu vou em primeiro lugar tentar colocar isso:

PowerShell.exe -file "C:\foo\countProcessProject.ps1"

Em um arquivo de lote e, em seguida, crie uma tarefa de agendamento que execute esse lote que executará o script do Powershell.

Supondo que você ainda não tenha tentado isso.

    
por 17.01.2014 / 15:03
0

Funciona quando você usa o comando start / b para gerar o powershell dentro do console do cmd.

start /b /wait Powershell.exe -file "C:\foo\countProcessProject.ps1"

Você pode confirmar que não está clicando em qualquer lugar da tela durante o script, permitindo a pausa no clique como descrito aqui.

    
por 17.01.2014 / 18:19
0

Eu ainda estou aprendendo PowerScript e não tenho os pontos para comentar acima, mas tenho olhado para isso e tenho algumas perguntas. Espero que você me agrade.

Primeiro, posso criar um arquivo de teste simples e executá-lo a partir do cmd assim:

$v = (dir | Where-Object { $_.name.Contains("test") } | measure).count
echo $v

Eu corro isso em cmd com:

powershell -file test.ps1

Demora um pouco, mas retorna 1 porque meu arquivo é test.ps1

O que é o "farm / processo de consulta"? Isto é um comando externo? E o que isso retorna? Eu acho que o pipe seguinte está esperando uma matriz, não é? Eu estou querendo saber o que acontece com os erros quando você executa a partir de cmd. Eu sei que um 2 > O sufixo de linha de comando null limpará qualquer erro.

    
por 17.01.2014 / 22:20