PowerShell 输出在函数之间交叉

2024-05-27

我正在 Windows 10 上的 5.1 版本中编写一个 PowerShell 脚本,该脚本获取有关本地系统(以及最终其子网)的某些信息并将其输出到文本文件中。起初,我将所有方面都集中在一个函数中。我在输出时遇到了输出问题getUsersAndGroups and getRunningProcesses函数,其中输出来自getUsersAndGroups将被注入到输出中getRunningProcesses.

这两个函数是:

    # Powershell script to get various properties and output to a text file

    Function getRunningProcesses()
    {
        # Running processes
        Write-Host "Running Processes:
    ------------ START PROCESS LIST ------------
        "
        Get-Process | Select-Object name,fileversion,productversion,company
        Write-Host "
    ------------- END PROCESS LIST -------------
    "
    }

    Function getUsersAndGroups()
    {
        # Get Users and Groups
        Write-Host "Users and Groups:"
        $adsi = [ADSI]"WinNT://$env:COMPUTERNAME"
        $adsi.Children | where {$_.SchemaClassName -eq 'user'} | Foreach-Object {
            $groups = $_.Groups() | Foreach-Object {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}
            $_ | Select-Object @{n='Username';e={$_.Name}},@{n='Group';e={$groups -join ';'}}
        }
    }

    getRunningProcesses
    getUsersAndGroups

当我打电话时getUsersAndGroups after getRunningProcesses,输出看起来像这样(不输出getUsersAndGroups根本):

Running Processes:
        ------------ START PROCESS LIST ------------


Name                FileVersion                                       ProductVersion Company                    
----                -----------                                       -------------- -------                    
armsvc                                                                                                          
aswidsagenta                                                                                                    
audiodg                                                                                                         
AVGSvc                                                                                                          
avgsvca                                                                                                         
avguix              1.182.2.64574                                     1.182.2.64574  AVG Technologies CZ, s.r.o.               
conhost             10.0.14393.0 (rs1_release.160715-1616)            10.0.14393.0   Microsoft Corporation      
csrss                                                                                                           
csrss                                                                                                           
dasHost                                                                                                         
dwm                                                                                                             
explorer            10.0.14393.0 (rs1_release.160715-1616)            10.0.14393.0   Microsoft Corporation      
hkcmd               8.15.10.2900                                      8.15.10.2900   Intel Corporation          
Idle                                                                                                            
igfxpers            8.15.10.2900                                      8.15.10.2900   Intel Corporation          
lsass                                                                                                           
MBAMService                                                                                                     
mDNSResponder                                                                                                   
Memory Compression                                                                                              
powershell_ise      10.0.14393.103 (rs1_release_inmarket.160819-1924) 10.0.14393.103 Microsoft Corporation      
RuntimeBroker       10.0.14393.0 (rs1_release.160715-1616)            10.0.14393.0   Microsoft Corporation      
SearchFilterHost                                                                                                
SearchIndexer                                                                                                   
SearchProtocolHost                                                                                              
SearchUI            10.0.14393.953 (rs1_release_inmarket.170303-1614) 10.0.14393.953 Microsoft Corporation      
services                                                                                                        
ShellExperienceHost 10.0.14393.447 (rs1_release_inmarket.161102-0100) 10.0.14393.447 Microsoft Corporation      
sihost              10.0.14393.0 (rs1_release.160715-1616)            10.0.14393.0   Microsoft Corporation           
smss                                                                                                            
spoolsv                                                                                                         
sqlwriter                                                                                                       
svchost                                                                                                         
svchost                                                                                                         
svchost                                                                                                         
svchost                                                                                                         
svchost                                                                                                         
svchost                                                                                                         
svchost                                                                                                         
svchost                                                                                                         
svchost                                                                                                         
svchost                                                                                                         
svchost                                                                                                         
svchost                                                                                                         
svchost                                                                                                         
svchost                                                                                                         
svchost                                                                                                         
svchost             10.0.14393.0 (rs1_release.160715-1616)            10.0.14393.0   Microsoft Corporation      
System                                                                                                          
taskhostw           10.0.14393.0 (rs1_release.160715-1616)            10.0.14393.0   Microsoft Corporation      
ToolbarUpdater                                                                                                  
wininit                                                                                                         
winlogon                                                                                                        
WtuSystemSupport                                                                                                
WUDFHost                                                                                                        

        ------------ END PROCESS LIST ------------

Users and Groups:

当我打电话时getUsersAndGroups before getRunningProcesses的输出getUsersAndGroups被注入getRunningProcesses更糟糕的是,根本没有列出正在运行的进程,而是有很多空行。

我怎样才能分离或控制输出getUsersAndGroups以便它在输出之前输出getRunningProcesses?

注入输出的输出如下所示:

Running Processes:
        ------------ START PROCESS LIST ------------

Username       Group                                                      
--------       -----                                                      
Administrator  Administrators                                             
debug255       Administrators;Hyper-V Administrators;Performance Log Users
DefaultAccount System Managed Accounts Group                              
Guest          Guests                                                     




































































        ------------ END PROCESS LIST ------------

非常感谢你的帮助!


tl; dr:

根本问题影响着双方Windows PowerShell and PowerShell(核心)7+,至少到 v7.3.4(截至撰写本文时为当前版本),并且由于它是设计行为的(不幸的)副作用,因此可能会也可能不会得到修复。

防止出现输出出故障了, force 同步显示输出, by 明确地呼叫Format-Table https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/format-table or Out-Host https://learn.microsoft.com/powershell/module/microsoft.powershell.core/out-host:

getUsersAndGroups | Format-Table
getRunningProcesses | Format-Table

Both Format-Table and Out-Host修复是什么主要是一个display problem,但他们是次优的解决方案因为他们俩干扰提供输出as data:

  • Format-Table输出格式说明而不是数据,它仅对 PowerShell 的用于显示输出格式化系统有意义,即当输出进入显示器或其中之一时Out-*cmdlet,特别是包括Out-File因此也>。结果格式为not适合于程序化的加工。

  • Out-Host输出根本没有数据和打印直接到显示屏,无法捕获或重定向它。

相关的GitHub 问题:

  • GitHub 问题 #4594 https://github.com/PowerShell/PowerShell/issues/4594: 讨论令人惊讶的异步行为一般来说。

  • GitHub 问题 #13985 https://github.com/PowerShell/PowerShell/issues/13985: 潜在的数据丢失使用 CLI 时。


背景资料:

InsidePowerShell 会话:

  • This is 主要是一个display problem, 你也是not需要此解决方法来捕获变量中的输出,将其重定向到文件,或通过管道传递它。

  • You do需要它交互的依赖显示输出的脚本show按输出顺序,其中特别包括确保打印相关信息在出现交互式提示之前; e.g.:

      # !! Without Format-table, the prompt shows *first*.
      [pscustomobject] @{ foo = 1; bar = 2 } | Format-Table
      Read-Host 'Does the above look OK?'
    

从外部,当调用PowerShell时CLI https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_powershell_exe (powershell -file ... or powershell -command ...):

  • 如果出现以下情况,则可能会发生实际数据丢失:Out-Host is not used,因为如果脚本/命令以以下结尾,挂起的异步输出可能永远不会打印exit - see GitHub 问题 #13985 https://github.com/PowerShell/PowerShell/issues/13985; e.g.:

    # !! Prints only 'first'
    powershell.exe -command "'first'; [pscustomobject] @{ foo = 'bar' }; exit"
    
  • However, unlike in intra-PowerShell-session use, Format-Table or Out-Host fix both the display and the data-capturing / redirection problem, because even Out-Host's output is sent to stdout, as seen by an outside caller (but note that the for-display representations that PowerShell's output-formatting system produces aren't generally suitable for programmatic processing).[1]

注:以上所有内容同样适用于PowerShell(核心)7+和它的pwsh https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_pwshCLI,至少达到 v7.3.1。


本例中 PowerShell 有问题的行为的解释:

用以下方法演示问题可能会有所帮助MCVE(最小、完整且可验证的示例) https://stackoverflow.com/help/mcve:

Write-Host "-- before"
[pscustomobject] @{ one = 1; two = 2; three = 3 }
Write-Host "-- after"

在 PSv5+ 中,这会产生:

-- before

-- after
one two three
--- --- -----
  1   2     3

发生了什么?

  • The Write-Host调用产生的输出同步地.

    • 值得一提的是Write-Host绕过正常的成功输出流并且(实际上)直接写入控制台 -大多数情况下,即使有合法用途,Write-Host应该避免 http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/.

    • 但是,请注意,即使输出对象发送到成功输出stream https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Redirection可以同步显示,而且经常如此,特别是作为原始 .NET 类型实例的对象,例如字符串和数字,以及隐式输出格式导致的对象非表格的输出以及具有与其关联的显式格式化数据的类型(见下文)。

  • The implicit输出 - 未捕获语句的输出[pscustomobject] @{ one = 1; two = 2; three = 3 } - was 意外地不同步:

    • 最初产生了一个空白行。
    • 全部实际输出followed决赛Write-Host call.

这个有用的答案 https://stackoverflow.com/a/34858911/45375解释为什么会发生这种情况;简而言之:

  • Implicit输出根据输出对象的类型进行格式化;就目前的情况而言,Format-Table被隐式使用。

  • In Psv5+, 隐含地应用Format-Table now waits长达 300 毫秒。以确定合适的列宽.

    • 但请注意,这仅适用于其类型的输出对象表格格式说明 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_format.ps1xml are 未预定义;如果他们是,they提前确定列宽,无需等待。

    • 测试给定类型是否具有全名<FullTypeName>有与之关联的表格式数据,您可以使用以下命令:

          # Outputs $true, if <FullTypeName> has predefined table-formatting data.
          Get-FormatData <FullTypeName> -PowerShellVersion $PSVersionTable.PSVersion |
            Where-Object { 
              $_.FormatViewDefinition.Control.ForEach('GetType') -contains [System.Management.Automation.TableControl] 
            }
      
  • 不幸的是,这意味着后续命令在该时间窗口内执行,可能会产生不相关的输出(通过管道)通过传递输出命令如Write-Host) 或提示用户输入before Format-Table输出开始。

    • 当调用 PowerShell CLI 时从外部 and exit在时间窗口内调用,所有待处理的输出 - 包括后续的同步输出 - 有效丢弃的.

有问题的行为在中讨论GitHub 问题 #4594 https://github.com/PowerShell/PowerShell/issues/4594;虽然仍有希望找到解决方案,但很长时间没有任何进展。


注意:这个答案最初错误地“归咎于”PSv5+ 300 毫秒。潜在令人惊讶的标准输出格式化行为的延迟(即first发送到管道的对象决定了显示格式all管道中的对象,如果应用表格式 - 请参阅这个答案 https://stackoverflow.com/a/45705068/45375).


[1] The CLI allows you to request output in a structured text format, namely the XML-based serialization format known as CLIXML, with -OutputFormat Xml. PowerShell uses this format behind the scenes for serializing data across processes, and it is not usually known to outside programs, which is why -OutputFormat Xml is rarely used in practice. Note that when you do use it, the Format-Table / Out-Host workarounds would again not be effective, given that the original output objects are lost.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PowerShell 输出在函数之间交叉 的相关文章

随机推荐

  • 为什么不能收集一定范围的字符?

    我正在尝试生成一个包含小写 ASCII 字符的向量 这种更复杂的方法有效 let ascii lowercase b a b z map b b as char collect
  • 序列化匿名类型

    我想将匿名类型变量转换为 byte 我该怎么做 我尝试过的 byte result var my new Test a1 Value 0 BinaryFormatter bf new BinaryFormatter using Memory
  • 为什么不能在循环或嵌套函数内调用 React Hooks?

    React Hooks 文档 https reactjs org docs hooks rules html only call hooks at the top level说不要在循环 条件或嵌套函数内调用 Hook 我知道执行顺序很重要
  • $1 [QSA,L] 在我的 .htaccess 文件中意味着什么?

    我需要改变我的 htaccess有两行我不明白 RewriteCond REQUEST FILENAME l RewriteRule index php url 1 QSA L 我什么时候应该使用这些线 不是提供完整教程的地方 但这里是简短
  • 使用 Node.js 捕获延迟加载页面的屏幕截图

    我正在寻找一种方法 可以在每次更改时对长网页进行屏幕截图 我想为此使用 Node js 我的问题是关于如何渲染带有图像的完整页面并将其保存到磁盘和图像文件 网页上的大多数图像都是延迟加载的 所以我想我需要先向下滚动整个页面 然后再进行屏幕截
  • Django Admin:引用用户的ForeignKey和ManyToManyField关系的排序

    我有一个使用 Django 的应用程序UserProfile扩展内置的 DjangoUser模型 看起来有点像 class UserProfile models Model user models ForeignKey User uniqu
  • 使用 Spring Boot 进行 Kafka 流

    我想在我的 Spring Boot 项目中使用 Kafka Streams 实时处理 所以我需要 Kafka Streams 配置或者我想使用 KStreams 或 KTable 但我在互联网上找不到示例 我做了生产者和消费者 现在我想实时
  • Matlab:如何读取以逗号作为小数分隔符的数字?

    我有很多 数十万 相当大 gt 0 5MB 的文件 其中数据是数字 但以逗号作为小数分隔符 使用像这样的外部工具对我来说是不切实际的sed s g 当分隔符是点时 我只使用textscan fid f f f 但我看不到更改小数点分隔符的选
  • 在搜索栏中输入查询并抓取结果

    我有一个数据库 其中包含不同书籍的 ISBN 号 我使用 Python 和 Beautifulsoup 收集了它们 接下来我想为书籍添加类别 书籍类别有一个标准 一个网站叫https www bol com nl https www bol
  • Android 第一个应用程序教程问题

    我一直在尝试让它工作 甚至完全按照教程所述复制和粘贴代码 但它似乎不起作用 我知道问题出在 MainActivity 或 DisplayMessageActivity 中 但我看不出出了什么问题 我还将 DisplayMessageActi
  • 尝试添加号码时无法使用 +

    在我选择选项 1 并添加数字 如 100 后 结果如下 100100 这是代码 var userAmount var userMoney 100 var totalMoney alert 1 Add alert 2 Subtraction
  • 如何正确定义析构函数

    我对 C 以及一般的编程 比较陌生 所以如果问题没有立即完全清楚 请原谅我 我所拥有的是一个程序 其中创建了内部定义的类 让我们称之为 class1 的一定数量的对象 程序运行得很好 对象也做了它们应该做的事情 我当前试图解决的问题如下 这
  • 使用查询时间排名的复杂“特色产品”模型(可选过滤器)

    我有一个products显示过滤结果的索引category pages 对于给定的category 任意数量的products可能会被标记为featured 表示它首先显示 When products显示为category 只有一个特色产品
  • 对列表中的每个数值列表求和

    我想将值附加到 R 中河图中的标签 我有一个值列表列表 需要它来显示节点之间的流 如下所示 edges lt list A list C 10 E 5 B list C 10 C list D 13 E 7 我知道有一个函数可以减少 或求和
  • jQuery Datepicker showAnim 没有动画

    我尝试了多种方法并在互联网上搜索 试图让动画发挥作用 但一无所获 我有日期选择器工作和日期格式选项 但没有动画 我希望使用 剪辑 选项 以下是各个文件中的内容 应用程序 js require jquery require jquery tu
  • Java ArrayList 的 (ArrayList).toString 的相反是什么?

    我正在使用toString的方法ArrayList储藏ArrayList数据到字符串中 我的问题是 我该如何走另一条路 是否有现有的方法可以解析中的数据String实例返回到ArrayList 最简洁的答案是不 没有简单的方法可以从字符串中
  • “composer”在 Windows 服务器中未被识别为内部或外部命令

    我使用的是Windows Server 2008操作系统 我下载作曲家安装程序 exe https getcomposer org download 并安装到我的电脑上 当我尝试时composer install 我收到错误 compose
  • Spring security:在 3.1 中,仅针对“GET”请求绕过安全过滤器

    我希望我的服务仅对传入的 POST PUT DELETE 请求执行身份验证 并绕过任何 GET 请求 Spring 版本低于 3 1 具有 filters none 属性 可用于绕过特定 URL 模式的所有安全过滤器 在 3 1 中 fil
  • 有没有办法限制 React-Native 中 TextInput 的长度?

    我一直在尝试使我的程序不允许您在 TextInput 组件中输入超过一定数量的字符 类似于 maxLength 对于输入的工作方式 我还没有找到任何类似的 textInput 的 maxLength 有没有一种简单的方法来设置 组件的最大字
  • PowerShell 输出在函数之间交叉

    我正在 Windows 10 上的 5 1 版本中编写一个 PowerShell 脚本 该脚本获取有关本地系统 以及最终其子网 的某些信息并将其输出到文本文件中 起初 我将所有方面都集中在一个函数中 我在输出时遇到了输出问题getUsers