Я обнаружил, что я много .GetType()
и | Get-Member
, и иногда я забываю, что это .GetType
, и я пытаюсь .Get-Type
Дух! ошибка!) , поэтому я пишу функцию для быстрого сбора этой информации. Это оказалось весьма полезным при работе с консолью (я ставлю команду core перед каждым выводом, чтобы никогда не забывать о подключении к реальным командам, поэтому больше подробного описания, чтобы поддерживать связь с языком).
Мне любопытно, есть ли дополнительные составные команды для извлечения полезной обобщенной c информации, которую мы могли бы использовать, чтобы сообщить о структуре данного объекта (вещи, которые мы можем быстро получить в очень компактном формате резюме) даже если для некоторой полезной информации о заданных объектах требуются более сложные команды)?
• $a = @(1,2,"x") ; obj $a
. Это возвращает 71 тип методов (System.String и System.Int32), поэтому я удалил дубликаты до 50 (хорошо, чтобы быстро увидеть, что можно использовать, но, возможно, хорошо, чтобы как-то также упомянуть различные типы, содержащиеся в этом массиве?) .
• Некоторый ввод, конечно, нарушит функцию, но даже такой пример ScriptBlock также отлично работает obj {$a; $x}
. Вы даже можете сделать что-то вроде obj "".GetType()
, чтобы увидеть там методы и свойства.
• Использование .Module
в GetType()
может быть избыточным, так как обычно выводит CommonLanguageRuntimeLibrary
, но может быть другим полезным информация от этих членов ( все , конечно, полезно в разное время, но мне любопытно обобщенный вывод c)?
• В целом, любые улучшения или другие составные команды, которые Вы используете или могли бы быть полезны для взлома открытой информации об объекте в быстром кратком представлении, было бы здорово узнать? : -)
Обновлен с -Force
, который @Clint предложил:
function obj ($cmd) {
if ($cmd -eq $null) { Write-Host "Object is `$null" ; return }
Write-Host "Contents:" -F Cyan
$cmd
""
Write-Host "(`$object).GetType()" -F Cyan -NoNewline ; Write-Host " :: [BaseType|Name|IsPublic|IsSerial|Module]"
($cmd).GetType() | % { "$($_.BaseType), $($_.Name), $($_.IsPublic), $($_.IsSerializable), $($_.Module)" }
""
Write-Host "`$object | Get-Member -Force" -F Cyan
$m = "" ; $p = "" ; $pp = "" ; $np = "" ; $sp = ""
$msum = 0 ; $psum = 0 ; $ppsum = 0 ; $npsum = 0 ; $spsum = 0
$($cmd | Get-Member -Force) | % {
if ($_.MemberType -eq "Method") { if(!($m -like "*$($_.Name),*")) { $m += "$($_.Name), " ; $msum++ } }
if ($_.MemberType -eq "Property") { if(!($p -like "*$($_.Name),*")) { $p += "$($_.Name), " ; $psum++ } }
if ($_.MemberType -eq "ParameterizedProperty") { if(!($pp -like "*$($_.Name),*")) { $pp += "$($_.Name), " ; $ppsum++} }
if ($_.MemberType -eq "NoteProperty") { if(!($np -like "*$($_.Name),*")) { $np += "$($_.Name), " ; $npsum++ } }
if ($_.MemberType -eq "ScriptProperty") { if(!($sp -like "*$($_.Name),*")) { $sp += "$($_.Name), " ; $npsum++ } }
}
if($msum -ne 0) { Write-Host ":: Method [$msum] => $($m.TrimEnd(", "))" }
if($psum -ne 0) { Write-Host ":: Property [$psum] => $($p.TrimEnd(", "))" }
if($ppsum -ne 0) { Write-Host ":: ParameterizedProperty [$ppsum] => $($pp.TrimEnd(", "))" }
if($npsum -ne 0) { Write-Host ":: NoteProperty [$npsum] => $($np.TrimEnd(", "))" }
if($spsum -ne 0) { Write-Host ":: ScriptProperty [$spsum] => $($sp.TrimEnd(", "))" }
""
}
Пример вывода:
C:\> $a = @(123,"x")
C:\> def $a
Contents:
123
x
($object).GetType() :: [BaseType|Name|IsPublic|IsSerial|Module]
array, Object[], True, True, CommonLanguageRuntimeLibrary
$object | Get-Member -Force
:: Method [50] => CompareTo, Equals, GetHashCode, GetType, GetTypeCode, ToBoolean, ToByte, ToChar, ToDateTime, ToDecimal, ToDouble, ToInt16,
ToInt32, ToInt64, ToSByte, ToSingle, ToString, ToType, ToUInt16, ToUInt32, ToUInt64, Clone, Contains, CopyTo, EndsWith, GetEnumerator,
get_Chars, get_Length, IndexOf, IndexOfAny, Insert, IsNormalized, LastIndexOf, LastIndexOfAny, Normalize, PadLeft, PadRight, Remove, Replace,
Split, StartsWith, Substring, ToCharArray, ToLower, ToLowerInvariant, ToUpper, ToUpperInvariant, Trim, TrimEnd, TrimStart
:: Property [1] => Length
:: ParameterizedProperty [1] => Chars