gpt4 book ai didi

powershell - 在什么情况下需要当 -NoTypeInformation *不* 传递给 ConvertTo-Csv 或 Export-Csv 时发出的信息?

转载 作者:行者123 更新时间:2023-12-04 18:25:22 30 4
gpt4 key购买 nike

今天突然想到,经过这么多年习惯性的路过-NoTypeInformation Export-Csv / ConvertTo-Csv 为了防止发出不需要的注释行,也许是 Import-Csv / ConvertFrom-Csv 如果我没有抑制该类型信息,将能够使用其原始属性类型(而不是所有属性类型都是 String )重建对象。我试了一下...

PS> Get-Service | ConvertTo-Csv

...而且,很长一段时间没有真正看到通过省略 -NoTypeInformation 发出的内容, 被提醒它只包括输入对象的类型(实际上只是第一个对象),而不是成员的类型......

#TYPE System.ServiceProcess.ServiceController
"Name","RequiredServices","CanPauseAndContinue","CanShutdown","CanStop","DisplayName","DependentServices","MachineName","ServiceName","ServicesDependedOn","ServiceHandle","Status","ServiceType","StartType","Site","Container"
...

比较序列化结果类型信息然后反序列化...

PS> Get-Service | ConvertTo-Csv | ConvertFrom-Csv | Get-Member


TypeName: CSV:System.ServiceProcess.ServiceController

Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
CanPauseAndContinue NoteProperty string CanPauseAndContinue=False
CanShutdown NoteProperty string CanShutdown=False
CanStop NoteProperty string CanStop=True
Container NoteProperty object Container=null
DependentServices NoteProperty string DependentServices=System.ServiceProcess.ServiceController[]
DisplayName NoteProperty string DisplayName=Adobe Acrobat Update Service
MachineName NoteProperty string MachineName=.
Name NoteProperty string Name=AdobeARMservice
RequiredServices NoteProperty string RequiredServices=System.ServiceProcess.ServiceController[]
ServiceHandle NoteProperty string ServiceHandle=
ServiceName NoteProperty string ServiceName=AdobeARMservice
ServicesDependedOn NoteProperty string ServicesDependedOn=System.ServiceProcess.ServiceController[]
ServiceType NoteProperty string ServiceType=Win32OwnProcess
Site NoteProperty string Site=
StartType NoteProperty string StartType=Automatic
Status NoteProperty string Status=Running

...到序列化没有类型信息然后反序列化的结果...

PS> Get-Service | ConvertTo-Csv -NoTypeInformation | ConvertFrom-Csv | Get-Member


TypeName: System.Management.Automation.PSCustomObject

Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
CanPauseAndContinue NoteProperty string CanPauseAndContinue=False
CanShutdown NoteProperty string CanShutdown=False
CanStop NoteProperty string CanStop=True
Container NoteProperty object Container=null
DependentServices NoteProperty string DependentServices=System.ServiceProcess.ServiceController[]
DisplayName NoteProperty string DisplayName=Adobe Acrobat Update Service
MachineName NoteProperty string MachineName=.
Name NoteProperty string Name=AdobeARMservice
RequiredServices NoteProperty string RequiredServices=System.ServiceProcess.ServiceController[]
ServiceHandle NoteProperty string ServiceHandle=
ServiceName NoteProperty string ServiceName=AdobeARMservice
ServicesDependedOn NoteProperty string ServicesDependedOn=System.ServiceProcess.ServiceController[]
ServiceType NoteProperty string ServiceType=Win32OwnProcess
Site NoteProperty string Site=
StartType NoteProperty string StartType=Automatic
Status NoteProperty string Status=Running

...唯一的区别是 TypeNameCSV:System.ServiceProcess.ServiceController 更改(由前缀为 #TYPECSV: 注释指定的相同类型)到 System.Management.Automation.PSCustomObject .所有成员都相同,所有属性的类型都是 String ,并且在这两种情况下,您都反序列化了对象,这些对象不包含的方法并且不以任何方式连接到原始对象或原始对象的代理。

显然,Microsoft 认为不仅需要在 CSV 输出中包含此类型信息,而且应该默认。因为我真的不能问“他们为什么这样做?”,我想知道这些信息怎么可能有用?执行 *-Csv序列化 cmdlet 将其用于设置 TypeName 以外的任何用途。每个对象?为什么我希望这种类型的信息在 CSV 输出中“带内”传递,而不是仅仅...知道这个包含服务信息的文件来自 System.ServiceProcess.ServiceController 实例,甚至根本不关心原始类型是什么,只要它具有我期望的属性即可?

我能想到的仅有的两个用例是,如果您收到由未知 PowerShell 脚本创建的 CSV 文件,那么拥有类型信息可以帮助确定使用哪个应用程序/库/模块来生成数据,或者如果您有一个荒谬的通用脚本试图根据类型信息刷新任意输入,就像这样......

Import-Csv ... `
| ForEach-Object -Process {
# Original type name of the first record, not necessarily this record!
$firstTypeName = $_.PSObject.TypeNames[0];

if ($firstTypeName -eq 'CSV:System.ServiceProcess.ServiceController')
{
Get-Service ...
}
elseif ('CSV:System.IO.DirectoryInfo', 'CSV:System.IO.FileInfo' -contains $firstTypeName)
{
Get-ChildItem ...
}
elseif ($firstTypeName -eq 'CSV:Microsoft.ActiveDirectory.Management.ADObject')
{
Get-ADObject ...
}
...
}

...但是这些并不是非常有说服力的示例,尤其是考虑到这一点,正如我指出的那样,这种类型的信息被认为非常重要,以至于默认包含它。还有其他我没有想到的用例吗?或者这仅仅是“包含它而不需要它比需要它而不包含它更好(并且便宜)”的情况?

相关: PowerShell GitHub issue讨论制作-NoTypeInformation future 版本(6.0,根据 cmdlet 文档)中的默认值,以及明显的共识,即没有必要省略 -NoTypeInformation .

最佳答案

如果你有一个 thing 可以理解 header 并且也知道如何构建那个类型的 other thing,那么第一个 thing可以想象地从字符串表示中创建一个或多个 other thing。我并不是说它有用,但我是说如果 .csv 可能可用而另一种类型的文件可能不可用,那么这是一个潜在用途。出于类似于我在此处回答您的问题时提到的原因,我可能确实这样做了,也可能没有这样做。

关于powershell - 在什么情况下需要当 -NoTypeInformation *不* 传递给 ConvertTo-Csv 或 Export-Csv 时发出的信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51736649/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com