Я написал сценарий 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
Хотя у меня нет подробного объяснения того, почему это может быть необходимо, вот как я могу обойти эту проблему:
Если вы настаиваете на использовании археологической жемчужины query farm
, это можно сделать с помощью cmd
в одиночку - не нужно усложнять простую задачу:
query farm /process |find /i "winproj" /c
Это выведет число процессов "winproj" почти так же, как ваш текущий оператор вызова 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 полностью избавит от любой ошибки.