本地语句输出与调用命令输出非常不同

2024-04-11

直接登录到系统,我运行此语句,并得到以下输出:

(Get-ClusterNetwork 'cluster backups').role
None

这是完美的……甚至美丽,因为它的简单。

然而,当我使用 invoke-command 从远程计算机运行完全相同的语句时,到目前为止我一直认为就像在计算机的 CLI 中输入这个完全相同的语句一样,我得到了这个输出

Invoke-Command -Session $hi -ScriptBlock {(Get-ClusterNetwork 'cluster backups').role}
PSComputerName RunspaceId                           Value
-------------- ----------                           -----
dumdum a84b6c89-dumdum-80d3-ed43230ee8ab            None

现在这是真正有趣的事情。如果我将一个变量分配给调用命令输出,它将具有与上面显示的相同的输出,除非 - 我将其通过管道传递给设置剪贴板

所以变量

$hello = invoke-command -session $hi -scriptblock {(get-networkcluster 'cluster backups').role}

现在在提示符中输入 $hello ,我得到:

PSComputerName RunspaceId                           Value
-------------- ----------                           -----
dumdum a84b6c89-dumdum-80d3-ed43230ee8ab            None

这是预料之中的。但现在当我把它输送到设置剪贴板并粘贴 - 值为:

$hello | set-clipboard;
get-clipboard
None

这就是我想要的实际值。不知何故,到 set-clipboard 的管道知道只提取我最初要求的属性。即使是变量,也具有所有的属性。当我运行 $hello.gettype() - 我看到的值为Int32。如果 $hello 只返回我想要的值,这是有道理的,但它......不是。

但如果这还不够奇怪的话——我在调用命令中运行了一些函数,这只是其中一部分——所有函数都返回一个我试图报告的值。所以:

$row = '' | select computername, ClusterNetworkRole, IP;
$row.computername = $name;
$row.clusternetworkrole = $hello;
$row.ip = dum.dum.dum.dum;
Return $row;

你知道 $row.clusternetworkrole 的输出是什么吗?大胆猜测一下。 除了我想要的以外,这是所有财产。

$row
PSComputerName     : dumdum
RunspaceId         : b898bdad-dumdum-9eff-8a2beeefe78a
ClusterNetworkRole :
Computername       : dum
IP                 : dum.dum.dum.dum

它不仅给了我我不想要的确切属性 - 它实际上将这些属性添加为 $row 的成员。

$row.RunspaceID
b898bdad-dumdum-9eff-8a2beeefe78a

现在我可以通过在语句末尾附加“.value”来获得我想要的值,所以这并不是一个需要解决的问题,而是一个关于 powershell 到底在做什么的问题。这句简单、美丽的小声明给我的生活带来了严重破坏。


根据您的具体情况的一个实例枚举值(一个实例System.Enum-派生类型):

  • Use [int] $hello得到数值原始的枚举 (System.Enum-派生)值,无需额外NoteProperty成员如PSComputerName远程处理基础设施添加的内容(见下文)。

  • Use $hello.Value得到string枚举值的表示(其符号name而不是它的number).

  • 如果你知道原著System.Enum-派生类型,并且该类型在您的本地会话中也可用,您可以cast反序列化后的对象恢复到其原始类型;例如。:
    [Microsoft.Foo.Bar.ClusterRole] $hello

  • $hello从技术上讲是[int],但装饰有额外的属性,以及有关的信息original类型记录在隐藏中.pstypenames数组,反映原始类型的继承层次结构,类型名称前缀为Deserialized.; e.g. Deserialized.Microsoft.Foo.Bar.ClusterRole; PowerShell 的输出格式化系统导致此类对象通过(隐式应用)进行格式化Format-Table,在本例中显示了一切but实际上[int]值——仅NoteProperty显示成员。

一般来说, 你可以排除不需要的属性如下:

  • For [string]仅实例,您可以访问.psobject.BaseObject获取没有任何底层对象NoteProperty成员。

  • 对于其他人,您可以创建一个new对象(总是类型[pscustomobject]),通过管道输送到Select-Object具有不需要的属性excluded,正如建议的李戴利 https://stackoverflow.com/users/3080908/lee-dailey):

    • $hello | Select-Object * -Exclude PSComputerName, PSShowComputerName, RunspaceId

    • 或者,您可以专注于仅选择您想要的属性do want.

请继续阅读以了解为什么这是必要的。


PowerShell 的远程基础架构装饰从远程调用返回的每个对象与以下NoteProperty ETS(扩展类型系统) https://github.com/MicrosoftDocs/PowerShell-Docs/issues/6763成员:

  • PSComputerName...远程计算机的名称

  • RunspaceId...执行远程命令的运行空间的 ID。

  • PSShowComputerName ... a hidden属性,当设置为$true在通过返回的所有对象上Invoke-Command https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/invoke-command's -HideComputerName开关、抑制display of the PSComputerName默认输出中的属性(但该属性仍然存在);你只能看到PSShowComputerName如果您通过管道将远程接收的对象传递给它本身Get-Member -Force.

  • 此外,System.Enum-派生类型,返回为[int]实例,装饰有[string]-typed Value NoteProperty包含枚举值象征性名称(枚举的type名字可以推断.pstypenames[0] -replace '^Deserialized\.').

The PSComputerName and RunspaceId属性在远程处理目标命令时很有用multiple立即计算机:鉴于无法保证接收输出的顺序,这些属性告诉您给定输出对象的来源。

The PSShowComputerName属性允许您控制默认显示行为 - 但奇怪的是,它对是否RunspaceId被展示。

The Value财产为System.Enum-派生类型补偿了通常发生在远程命令中的类型保真度丢失(和后台作业) - 只有一组有限的已知类型以类型保真度反序列化 - 请参阅这个答案 https://stackoverflow.com/a/59180367/45375.


虽然这些属性总是exist, 无论他们怎样默认显示取决于返回对象的特定类型以及与它们关联的格式数据或 PowerShell 默认应用的格式数据。

此外,当您通过管道传输到时,它们可能会显示Format-*显式地在序列化期间使用 cmdlet,例如使用ConvertTo-Json https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/convertto-json.

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

本地语句输出与调用命令输出非常不同 的相关文章

随机推荐

  • mysql 小数和tinyint 乘法精度

    在 mysql 5 1 中 我有一个包含两列的表 create table t1 price decimal 6 2 quantity tinyint 4 在我正在做的选择查询中 select sum price quantity from
  • UglifyJS 属性修改

    根据文档 UglifyJS 可以修改除提供的保留列表中的属性名称之外的所有属性名称 是否可以用其他方式做到这一点 这样只有提供的列表上的属性才会被破坏 如果是这样 我需要传递哪些选项uglify minify files 实现您正在寻找的白
  • 批量格式化文件日期YYYYMMDD

    我一直在处理批处理文件中的一些代码 用于评估两个文件日期 如果一个日期大于另一个日期 则会运行另一个 bat 文件 我想要做的是将两个日期格式化为 YYYYMMDD 以便我可以使用GTR 比 更棒 代码如下 但如果我使用它就可以工作 equ
  • 描述时间序列 pandas 中的间隙

    我正在尝试编写一个函数 该函数采用连续的时间序列并返回一个数据结构 该数据结构描述数据中任何缺失的间隙 例如带有 开始 和 结束 列的 DF 对于时间序列来说 这似乎是一个相当常见的问题 但是尽管使用了 groupby diff 等 并进行
  • CSS 通过舷窗查看

    我正在尝试使用 CSS 创建一个 舷窗 当我说舷窗时 我的意思是使屏幕的一部分透明 这样您就可以看到舷窗后面的任何内容 仅此而已 我能够通过将主体的背景颜色设置为与前景色相同 然后使用具有圆形渐变的舷窗图像来获得我想要的效果 中间为白色 边
  • Visual Studio 2010 - 半透明浮动窗口

    是否可以在 Visual Studio 2010 中使浮动窗口半透明 我希望能够浮动编辑器窗口并降低其 Alpha 级别 可以使用修改股票编辑器窗口的扩展来创建此功能吗 如果不是扩展 是否有合适的第三方应用程序能够修改 Visual Stu
  • Android进度条嵌入在ui中而不是对话框中

    有没有一种方法可以在不使用对话框的情况下将进度条嵌入到 UI 中 不是以编程方式 而是使用布局 xml 文件 我猜它必须是某种动画或 可绘制 您可以使用ProgressBar widget
  • scala.ScalaReflectionException: 不是一个术语

    我在 Spark 中有以下代码 rdd map processFunction saveToCassandra keyspace tableName Where def processFunction src String Seq Any
  • 获取令牌身份验证视图时出现 Django REST HTTP 400 错误

    我想在后端使用 Django 和 Django REST 框架来对本机 android 应用程序上的用户进行身份验证 我目前正在使用基于令牌的身份验证系统 更多细节 http www django rest framework org ap
  • 将 webmock 与黄瓜一起使用

    我正在使用 webmock 但它不适用于黄瓜测试 在我的 Gemfile 中 gem vcr gem webmock 在我的 features support env rb 中 我有 require webmock cucumber Web
  • 为什么我无法将边框应用到有角度的垫表行?

    我有一个简单的角度材料表 table table
  • 如何将 raku -e 和 -n 与多个文件 glob 一起使用

    我想在 Windows 上的 raku 中执行以下操作 raku n e say if mydatabegin file 无法打开文件 C file 参数无效 glob 不被解释为 glob 我认为这是因为 Windows 要求你的程序自己
  • 将整数静态转换为指针类型

    我只是不知道如何在 C 中编译这个简单的示例 class C public static const void noop static cast
  • node-sass-middleware 只提供一次 css 文件

    我使用 Jade 和 Sass 制作了一个非常简单的 Express 网站 但是我的 node sass 中间件遇到了问题 我的服务器只提供一次 CSS 文件 然后为每个后续请求返回 404 我必须重新启动服务器才能暂时修复它 这是我的代码
  • 在 WPF 动画中,将属性 BeginTime 设置为静态资源

    我想要做的是使用资源定义我的动画的所有开始时间 例如 我想要
  • 重写问题 - L(ast) 不被尊重?

    所以我正在为一个网站开发 CSS JS 压缩系统 该系统基本上具有以下 htaccess RewriteEngine On RewriteRule css images images site 1 QUERY STRING L Rewrit
  • 多线程应用程序中的异常。

    我从一位非常有洞察力的人那里听说 线程中抛出 而不是捕获 的异常正在传播到父线程 真的吗 我尝试过类似的操作 但无法捕获创建线程中的异常 static void Main string args ParameterizedThreadSta
  • MySQL 5.7 innoDB集群中的一个节点崩溃并且无法将崩溃的节点重新加入集群

    我们的一个环境中有一个 MySQL innodb 集群 集群中的一个节点崩溃了 虽然我们能够使崩溃的节点联机 但无法将其加入集群 有人可以帮助恢复 恢复节点并将其加入集群吗 我们尝试使用 dba rebootClusterFromCompl
  • SMTP 客户端在本地主机上发送消息失败,在远程主机上成功

    我有一个小型 tcp 服务器 除其他外 还用于通过 SMTP 服务器发送邮件 问题是 当我在开发计算机 到 smtp 服务器的远程连接 上运行它时它可以正常工作 但是当我在与 SMTP 服务器 Windows Server 2008 R2
  • 本地语句输出与调用命令输出非常不同

    直接登录到系统 我运行此语句 并得到以下输出 Get ClusterNetwork cluster backups role None 这是完美的 甚至美丽 因为它的简单 然而 当我使用 invoke command 从远程计算机运行完全相