У меня проблема в PowerShell, где 1-элементный массив, возвращаемый функцией, не возвращается в виде массива. Я нашел несколько мест, где были заданы подобные вопросы (PowerShell: How can I to force to get a result as an Array instead of Object & How can I force Powershell to return an array when a call only returns one object?), но решения там не работают для меня. Вот мой код:возвращает один объект из функции в виде массива
function x()
{
$levelMappings = @()
$levelMappings += @{"a"="b";"c"="d"}
return @($levelMappings)
}
(x).gettype().name
возвращает
Hashtable
Я не хочу этого, я хочу, чтобы вещь, которая получает возвращенное всегда быть массив, даже если это только имеет в нем один элемент. Я знаю, что я могу обойти это явно преобразовать возвращаемое значение функции в массив:
function x()
{
$levelMappings = @()
$levelMappings += @{"a"="b";"c"="d"}
return @($levelMappings)
}
@(x).gettype().name
, но я не хочу, чтобы сделать это. Я хочу, чтобы функция надежно возвращала массив каждый раз.
Ответы на более ранний проект этого вопроса посоветовал мне использовать унарный оператор, который работал лакомство за исключением, что, когда я труба результат к ConvertTo-Json (который, в конечном счете то, что мне нужно сделать) то я не получаю желаемого результата. Обратите внимание:
function x()
{
$levelMappings = @()
$levelMappings += @{"a"="b";"c"="d"}
$levelMappings += @{"e"="f";"g"="h"}
return ,$levelMappings
}
(x).gettype().name
x | ConvertTo-Json
После запуска его результат является:
{
"значение": [
{
"с": "д",
"а": " б»
}, {
"г": "ч",
"е": "е"
}
],
"Граф": 2
}
Как вы можете видеть объект я serialising в JSON был обернут внутри объекта JSON value
, и теперь у меня есть объект count
. Это не то, что я хочу. Любой способ решить это?
Другое обновление. Я обнаружил, что могу заключить вызов функции в круглые скобки, и, похоже, он ее разрешает.
function x()
{
$levelMappings = @()
$levelMappings += @{"a"="b";"c"="d"}
$levelMappings += @{"e"="f";"g"="h"}
return ,$levelMappings
}
(x).gettype().name
(x) | ConvertTo-Json
он возвращает
[
{
"с": "д",
"а": "б"
},
{
"г" : "h",
"e": "f"
}
]
Его не идеальный ... но он действительно работает.
Третье обновление, нет, это не сработает. Если его 1-элементный массив из Я вернулся к исходной задаче:
function x()
{
$levelMappings = @()
$levelMappings += @{"a"="b"}
return ,$levelMappings
}
(x).gettype().name
(x) | ConvertTo-Json
дает:
{
"а": "б"
}
Я сдаюсь!!!
Четвертое обновление ...
Ох, и если я швырнуть возвращаемое значение в хэш-таблицу и конвертировать, что JSON:
function x()
{
$levelMappings = @()
$levelMappings += @{"a"="b"}
return ,$levelMappings
}
$hashtable = @{}
$hashtable.Add('somekey',(x))
$hashtable | ConvertTo-Json
он выступает в качестве одного элемента массива JSON!
{
"somekey": [
{
"а": "б"
}
]
}
Arrghh !!! :)
'возвращение, $ levelMappings' –
Возможный дубликат [Есть ли способ для вызывающего пользователя получить вывод функции powershell w не подвергая его (возможному) разворачиванию трубопровода?] (http://stackoverflow.com/questions/28724537/is-there-a-way-for-a-caller-to-get-the-output-of-a- powershell-function-without-s) –
О, это красиво. Большое спасибо. Я подумал, что, возможно, это был обман, но он много искал и ничего не нашел. – jamiet