Ниже показано, что возвращаемый тип отличается от количества возвращенных строк. Почему он разработан таким образом? Очень легко сделать предположение, что он всегда возвращает массив и записывает код $a.Length
, который будет вызывать ошибку, когда он возвращает только одну строку, если только она не написана как $a | % { ....}
$a = @(invoke-....)
, что легко забыть.Confused Powershell возвращает тип массива
$a=Invoke-Sqlcmd -ServerInstance server "select 1 a"
$b=Invoke-Sqlcmd -ServerInstance server "select 1 a union all select 2"
$a.GetType()
IsPublic IsSerial Name BaseType -------- -------- ---- -------- True False DataRow System.Object
И следующий оператор возвращает массив объекта (кстати, почему бы не массив DataRow?)
$b.GetType()
IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object[] System.Array
Однако gm
возвращает тот же тип для обе переменные. Почему он разработан таким образом, который может быть очень смущен.
Вопрос:
- Какой смысл, что массив удаляется, когда только один элемент возвращается?
- Почему
gm
получить тип элемента массива? Как доgm
массива? - Почему
getType()
не может вернуть тип данных элемента, когда он возвращает тип массива?
?
PS SQLSERVER:\> $a|gm
TypeName: System.Data.DataRow
Name MemberType Definition
---- ---------- ----------
AcceptChanges Method void AcceptChanges()
......
ToString Method string ToString()
Item ParameterizedProperty System.Object Item(int columnIndex) {get;set;}, System.Object Item(string co...
a Property int a {get;set;}
PS SQLSERVER:\> $b|gm
TypeName: System.Data.DataRow
Name MemberType Definition
---- ---------- ----------
AcceptChanges Method void AcceptChanges()
......
ToString Method string ToString()
Item ParameterizedProperty System.Object Item(int columnIndex) {get;set;}, System.Object Item(string co...
a Property int a {get;set;}
Хотелось бы, чтобы я мог ответить на этот вопрос, но я думаю, что мне не хватает ключевых ключей. 1. Это может быть до 'Invoke-Sqlcmd', а также зависит от вашей версии PowerShell. 2. Get-Member действует на элементы, переданные в трубе, а не на весь объект, поэтому 3. возвращает то, что он делает. – Matt
Какую версию PowerShell вы используете? – briantist