Назад | Перейти на главную страницу

Сценарий powershell ждет вывода на печать, пока я не нажму кнопку

Я написал сценарий PS1, который подсчитает, сколько процессов (в данном случае MS Project) запущено на ферме Citrix.

Код это:

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

Если я выполняю PS1 из powershell, он работает безупречно, но если я вызываю его из cmd (для его планирования), используя файл powershell.exe "C: \ foo \ countProcessProject.ps1" или powershell.exe -c "C: \ foo \ countProcessProject.ps1 "сценарий остановится, пока я не нажму кнопку несколько раз, выводя переменную.

Я сравнил переменные среды при выполнении CMD и PS, и они почти одинаковы.

Приветствую,

Вы можете заставить его вернуться, используя -NonInteractive аргумент с PowerShell:

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

Хотя у меня нет подробного объяснения того, почему это может быть необходимо, вот как я могу обойти эту проблему:

Без PowerShell:

Если вы настаиваете на использовании археологической жемчужины query farm, это можно сделать с помощью cmd в одиночку - не нужно усложнять простую задачу:

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

Это выведет число процессов "winproj" почти так же, как ваш текущий оператор вызова PowerShell.

Используя только PowerShell:

Если вы хотите перейти к решению, в большей степени ориентированному на PowerShell, вы можете использовать оснастки PS, включенные в официальный Пакет SDK для XenApp PowerShell от Citrix:

Add-PSSnapin Citrix.XenApp.Commands
$FarmProcs = Get-XAServer -OnlineOnly | Get-XASessionProcess
$MSProjProcs = $FarmProcs | Where {ProcessName -match "winproj"} | Measure-Object
return $MSProjProcs.Count

Я в первую очередь попробую написать следующее:

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

В пакетном файле, а затем создайте задачу расписания, которая запускает этот пакет, который будет запускать ваш сценарий Powershell.

Предполагая, что вы еще не пробовали это.

Работает ли это, когда вы используете команду start / b для создания powershell внутри консоли cmd.

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

Можете ли вы подтвердить, что не нажимаете где-либо на экране во время сценария, включив паузу щелчка как описано здесь.

Я все еще изучаю PowerScript, и у меня нет поводов для комментариев выше, но я смотрел на это и у меня есть несколько вопросов. Надеюсь, ты мне доставишь удовольствие.

Сначала я могу создать простой тестовый файл и запустить его из cmd следующим образом:

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

Я запускаю это в cmd с помощью:

powershell -file test.ps1

Это занимает некоторое время, но затем возвращается 1, потому что мой файл - test.ps1


Что такое «ферма запросов / процесс»? Это внешняя команда? И что это возвращает? Я думаю, что следующий за ним трубопровод ожидает массив, не так ли? Мне интересно, что происходит с ошибками при запуске из cmd. Я знаю, что суффикс командной строки 2> null полностью избавит от любой ошибки.