与以分号作为单行运行相比,逐行运行会产生奇怪的结果

2023-12-14

我正在尝试创建一个简单的单行 Powershell 命令,该命令将列出给定进程名称的所有 TCP 和 UDP 端口。

如果我一行一行地运行这些行,它会产生预期的输出。如果我将所有四行代码放入一行,并使用分号分隔各行,则会产生不同的结果。请参阅下面的两个代码示例:

下面是设置进程名称的四行单独的行,使用该进程名称来根据进程名称获取一些 PID。然后使用进程 PID 来过滤底部两个命令的结果。

$processName = "outlook"
$processIds = Get-Process $processName
Get-NetTCPConnection | ? {$_.OwningProcess -in $processIds.Id}
Get-NetUDPEndpoint | ? {$_.OwningProcess -in $processIds.Id}

以上有效。如果我将所有这些行放入一行并用分号分隔它们,我会得到不同的结果:

$processName = "outlook";$processIds = Get-Process $processName;Get-NetTCPConnection | ? {$_.OwningProcess -in $processIds.Id};Get-NetUDPEndpoint | ? {$_.OwningProcess -in $processIds.Id};

这几乎就像是通过管道将最后两个命令相互传递。或者格式可能已关闭,我不确定。我预计分号会产生相同的结果,就像每一行都被一行一行地运行一样。


TLDR:它的设计初衷是为了解决复杂的问题(请参阅 Github 问题 #4552:在同一管道中启用不同对象类型的格式化).

第一个示例中发生的情况是,每个命令单独输出其对象数据。在这种情况下,PowerShell将引用格式文件"C:\Windows\System32\WindowsPowerShell\v1.0\Modules\NetTCPIP\Tcpip.Format.ps1xml"查看对象的默认格式是什么。在本例中,从格式文件中,PowerShell 被告知根据对象的类型将两个对象格式化为表。

当您将命令链接成一个时,First对象将确定整行的输出格式。在此示例中,它将位于Microsoft.Management.Infrastructure.CimInstance#ROOT/StandardCimv2/MSFT_NetTCPConnection格式。由于第二个命令输出一个类型的对象.../MSFT_NetUDPEndpoint不能以同样的方式对其进行格式化。虽然它可以共享相同的列,因为定义了特定的对象格式,然后 PowerShell 默认以回退方式输出对象,尽力而为Format-List * format.

This is 按设计因为很难即时确定单独的格式,尤其是当您开始使用混合类型的数组时。因此,他们决定最好使用第一个对象来确定类型,然后通过后备处理不同的对象。

我们可以做一些测试来看看 PowerShell 处理格式的不同方式:

#For brevity sake, let's assign variables for our examples:
$processName = "outlook"
$processIds = Get-Process $processName
$TCP = Get-NetTCPConnection | ? {$_.OwningProcess -in $processIds.Id}
$UDP = Get-NetUDPEndpoint | ? {$_.OwningProcess -in $processIds.Id}

先单独说一下:

PS> $TCP

LocalAddress                        LocalPort RemoteAddress                       RemotePort State       AppliedSetting OwningProcess
------------                        --------- -------------                       ---------- -----       -------------- -------------
0.0.0.0                             65045     0.0.0.0                             0          Bound                      24200
0.0.0.0                             56125     0.0.0.0                             0          Bound                      24200

PS> $UDP

LocalAddress                             LocalPort
------------                             ---------
::                                       5353
0.0.0.0                                  5353

这正是我们想要的。然而,当我们链接对象时,输出将是:

PS> $TCP; $UDP

LocalAddress                        LocalPort RemoteAddress                       RemotePort State       AppliedSetting OwningProcess
------------                        --------- -------------                       ---------- -----       -------------- -------------
0.0.0.0                             65045     0.0.0.0                             0          Bound                      24200
0.0.0.0                             56125     0.0.0.0                             0          Bound                      24200

Caption                  :
Description              :
ElementName              :
InstanceID               : ::++5353
CommunicationStatus      :
DetailedStatus           :
HealthState              :
InstallDate              :
Name                     :
OperatingStatus          :
OperationalStatus        :
PrimaryStatus            :
Status                   :
StatusDescriptions       :
AvailableRequestedStates :
EnabledDefault           : 2
EnabledState             :
OtherEnabledState        :
RequestedState           : 5
TimeOfLastStateChange    :
TransitioningToState     : 12
AggregationBehavior      :
Directionality           :
CreationTime             : 2019-04-15 9:05:09 AM
LocalAddress             : ::
LocalPort                : 5353
OwningProcess            : 24200
PSComputerName           :

Caption                  :
Description              :
ElementName              :
InstanceID               : 0.0.0.0++5353
CommunicationStatus      :
DetailedStatus           :
HealthState              :
InstallDate              :
Name                     :
OperatingStatus          :
OperationalStatus        :
PrimaryStatus            :
Status                   :
StatusDescriptions       :
AvailableRequestedStates :
EnabledDefault           : 2
EnabledState             :
OtherEnabledState        :
RequestedState           : 5
TimeOfLastStateChange    :
TransitioningToState     : 12
AggregationBehavior      :
Directionality           :
CreationTime             : 2019-04-15 9:05:09 AM
LocalAddress             : 0.0.0.0
LocalPort                : 5353
OwningProcess            : 24200
PSComputerName           :

第一个对象正确显示,第二个对象则回落到Format-List *。现在,让我们添加一个Select陈述:

PS> $TCP | Select LocalAddress, LocalPort ; $UDP

LocalAddress LocalPort
------------ ---------
0.0.0.0          65045
0.0.0.0          56125
::                5353
0.0.0.0           5353

在这里我们看到,由于我们正在将 TCP 对象转换为PSCustomObject,与Select声明,我们的$UDP对象可以“适合”表格格式,它与管道中的其余对象一起流动!(注意:这可能是意外的,因为您不知道一个对象在哪里结束,下一个对象从哪里开始!)

最终的解决方法是通过使用来“冲洗”管道Out-String:

PS> $TCP | Out-String; $UDP

LocalAddress                        LocalPort RemoteAddress                       RemotePort State       AppliedSetting OwningProcess
------------                        --------- -------------                       ---------- -----       -------------- -------------
0.0.0.0                             65045     0.0.0.0                             0          Bound                      24200
0.0.0.0                             56125     0.0.0.0                             0          Bound                      24200


LocalAddress                             LocalPort
------------                             ---------
::                                       5353
0.0.0.0                                  5353

这为我们提供了我们可能希望看到的输出,但在同一行中链接多个对象类型可能仍然不是最佳实践。

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

与以分号作为单行运行相比,逐行运行会产生奇怪的结果 的相关文章

随机推荐

  • 如何阻止其他应用程序使用麦克风?

    我正在开发 android voip 应用程序 我想确定是否有其他应用程序正在使用麦克风 通过这个 我想在使用麦克风时阻止其他应用程序访问麦克风 请任何人有想法 这对我很有帮助 Thanks 最后知道我们可以检查麦克风的可用性 如下所示 p
  • 为什么我的 Bash 代码在使用“sh”运行时会失败?

    我有一行代码在我的终端中运行良好 for i in mp4 do echo ffmpeg i i i mp4 mp3 done 然后我将完全相同的代码行放入脚本中myscript sh bin sh for i in mp4 do echo
  • 如何覆盖 HWIOAuthBundle twig 文件

    我是 Symfony2 3 FosUserBundle 的 HWIOAuthBundle 新手 我在我的项目中使用这个包来登录 facebook twitter googleplus 我已经成功安装了这个并且工作正常 但我想覆盖 login
  • 使用 SQLAlchemy ORM 批量插入

    有什么方法可以让 SQLAlchemy 进行批量插入而不是插入每个单独的对象 IE doing INSERT INTO foo bar VALUES 1 2 3 而不是 INSERT INTO foo bar VALUES 1 INSERT
  • 如何在Google AppEngine上实现“自动增量”

    我必须以 强单调递增 的方式来标记某些东西 发票号码 运输标签号码等 一个号码不得使用两次 当所有较小的数字都已被使用时 没有孔 每个数字都应该被使用 奇特的说法 我需要数 1 2 3 4 我可用的号码空间通常有 100 000 个号码 而
  • VBA 是一种 OOP 语言吗?它支持多态性吗?

    我实际上正在做我的第一个VBA项目 来自C 我想改进现有的VBA项目使用的微软Excel通过实现类和多态性的工作簿 我的问题是 1 我读了很多文章 论坛解释了这一点VBA不是面向对象编程 OOP 语言并且不支持多态性 其中一些人提出了使用关
  • Windows 7 IIS7.5 和 asp 应用程序错误 HTTP 404.0 - 未找到

    我有一个经典 ASP 应用程序 现在我将其安装在装有 Windows7 64 位和 IIS 7 5 的新 PC 上 问题是 当应用程序尝试打开数据库时 出现以下错误 错误 HTTP 404 0 未找到 我尝试从该路径打开数据库并且它工作正常
  • 窗口变量名

    我正在查看一些代码 在脚本的开头我们有var emailID email 稍后 代码通过以下方式引用 emailIDwindow emailID 我想知道允许您通过 window variableName 引用变量的规则是什么 我无法在网上
  • 如何为日期添加天数?

    我的代码是这样的 table class table tbody tr th Date th th Charge th tr foreach cancel policy api as key gt value tr td value Che
  • 没有 JavaScript 的 CSS 菜单

    任何人都可以提供参考 或者是否可以完全依赖于创建一个菜单CSS and not a single bit of javascript 需求是一个下拉菜单 其中可以有很多children submenu 如果像这样创建的话 任何东西都会cro
  • 语音识别连接错误

    我正在尝试基于 VoiceRecognition java 示例来研究和测试语音识别示例 网址为http developer android com resources samples ApiDemos src com example an
  • 是否有一个“String.Format”可以接受命名输入参数而不是索引占位符? [复制]

    这个问题在这里已经有答案了 这就是我所知道的 str String Format Her name is 0 and she s 1 years old Lisa 10 但我想要类似的东西 str String Her name is na
  • PHP Mysql PDO:一般错误:2006 MySQL 服务器已消失

    我当前正在运行一个自定义 php 脚本 该脚本在我的本地主机上运行时工作正常 但是在共享主机上运行时 我收到以下错误 致命错误 未捕获异常 PDOException 消息为 SQLSTATE HY000 一般错误 2006 MySQL 服务
  • 尝试在 iOS 中使用 AVAssetDownloadURLSession 下载 m3u8 视频时出现错误

    尝试下载 m3u8 视频文件 http devimages apple com iphone samples bipbop bipbopall m3u8 使用 AVAssetDownloadURLSession 当我在 Xcode 中运行代
  • HTTPS 仅适用于本地主机

    我正在尝试在我的一个 EC2 实例上设置 https 我已经这样做过很多次了 但由于某种原因 在这个例子中 它拒绝工作 Problem 当我通过本地 ip 连接到域时 https 工作正常 当我通过公共IP连接到域时 https 不起作用浏
  • 在 WooCommerce 3.3 中更改产品缩略图大小

    我在 WooCommerce 3 3 中更改产品缩略图 图像大小时遇到 一些问题 我曾经能够在 WooCommerce gt 设置 gt 产品 gt 显示下的管理中执行此操作 但我再也看不到显示选项卡了 此功能是否已被移动或者现在有其他方法
  • 自定义验证器控制反应形式的数量

    我很难在 Angular 的反应式表单中实现自定义验证 我需要控制数量 数量不应超过可用数量 问题是如果每行都有子行 我如何获得所有数量的总数 我如何能够计算子行的总数并将其与找到可用数量的父行进行比较 下面是我的代码 这也是我的代码的链接
  • 如何从带有节点的函数返回 XML 文件?

    我有一个简单的 XML
  • 以二进制模式打开输入文件流时设置的skipws标志

    我知道不应在以二进制模式打开的输入流上使用提取运算符 但成员函数read应该使用 std ifstream ifs file bin std ios in std ios binary char c ifs gt gt c Should n
  • 与以分号作为单行运行相比,逐行运行会产生奇怪的结果

    我正在尝试创建一个简单的单行 Powershell 命令 该命令将列出给定进程名称的所有 TCP 和 UDP 端口 如果我一行一行地运行这些行 它会产生预期的输出 如果我将所有四行代码放入一行 并使用分号分隔各行 则会产生不同的结果 请参阅