我编写了一个 PS1 脚本,用于计算 Citrix 场中正在运行的进程数(在本例中为 MS Project)。
其代码为:
$variable=(query farm /process | where { $_.Contains("WINPROJ") } | measure ).count
echo $variable
如果我从 powershell 执行 PS1,它可以完美运行,但如果我使用 powershell.exe -file "C:\foo\countProcessProject.ps1" 或 powershell.exe -c "C:\foo\countProcessProject.ps1" 从 cmd 调用它(用于安排它),脚本将停止,直到我多次按下按钮并输出变量。
我比较了CMD和PS执行的环境变量,几乎相同。
问候,
答案1
您也许能够使用-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 为中心的解决方案,则可以使用官方 XenApp PowerShell SDK来自 Citrix:
Add-PSSnapin Citrix.XenApp.Commands
$FarmProcs = Get-XAServer -OnlineOnly | Get-XASessionProcess
$MSProjProcs = $FarmProcs | Where {ProcessName -match "winproj"} | Measure-Object
return $MSProjProcs.Count
答案2
我首先会尝试这样做:
PowerShell.exe -file "C:\foo\countProcessProject.ps1"
在批处理文件中,然后创建运行此批处理的计划任务,该批处理将运行您的 Powershell 脚本。
假设您还没有尝试过这个。
答案3
当您使用 start /b 命令在 cmd 控制台内生成 powershell 时它是否有效。
start /b /wait Powershell.exe -file "C:\foo\countProcessProject.ps1"
您能否确认在脚本启用点击暂停功能期间您没有点击屏幕上的任何地方这里描述。
答案4
我仍在学习 PowerScript,没有要点可以评论,但我一直在看这个,并且有一些问题。希望您能包容我。
首先,我可以创建一个简单的测试文件并从 cmd 运行它,如下所示:
$v = (dir | Where-Object { $_.name.Contains("test") } | measure).count
echo $v
我在 cmd 中运行它:
powershell -file test.ps1
它需要一点时间,但随后返回 1,因为我的文件是 test.ps1
什么是“查询场/进程”?这是外部命令吗?它返回什么?我认为它后面的管道需要一个数组,不是吗?我想知道从 cmd 运行时会发生什么错误。我知道 2> 命令行后缀 null 将干净地消除任何错误。