POWERSHELL For Each - многомерный массив возвращает строку, а не массив - PullRequest
1 голос
/ 08 марта 2020

Я новичок в Powershell и все еще открываю для себя -

[string[][]] $adusers = (
     ( "John", "Smith", "jsmith", "jsmith@smitty.com" ),
     ( "James", "Johnson", "jjohnson", "jjohnson@smitty.com" )
)

Второе измерение может быть возвращено как массив 1 измерения.

 $adusers.GetType();
 $adusers[0].GetType();
 $adusers[1][2].GetType();

 IsPublic IsSerial Name                                     BaseType                                                                                 
 -------- -------- ----                                     --------                                                                                 
 True     True     String[][]                               System.Array                                                                             
 True     True     String[]                                 System.Array                                                                             
 True     True     String                                   System.Object                                                                            

Для каждого с 2-мерным массивом объединяет элементы массива 2-го измерения с разделителем пробелов и возвращает строковый объект.

Есть ли какой-то синтаксис, который мне не хватает для CAST переменной $ user в измерении? Должен ли я?

Почему PowerShell объединяет их все вместе как строку?

$ForEach($user in $adusers){

    $adusers.GetType();
    $user.GetType();

    $user[0]
    $user[1]
    $user[2]
    $user[3]

}

Выход

IsPublic IsSerial Name                                     BaseType                                                                                 
-------- -------- ----                                     --------                                                                                 
True     True     String[][]                               System.Array                                                                             
True     True     String                                   System.Object                                                                            
J
o
h
n
True     True     String[][]                               System.Array                                                                             
True     True     String                                   System.Object                                                                            
J
a
m
e

********* ******************* ОБНОВИТЬ ******************************

Проблема заканчивается тем, что я инициализировал переменную $ user ранее в другом фрагменте кода в том же сценарии (используя выбор прогона).

[String]$user = "testUser"

ForEach выполнял приведение 1-мерный массив в строку - при условии, что это то, что я хотел.

Я попытался объявить $ user как 1-мерный массив, но неверно:

[string]$user = ""
[string[]]$user
$user.GetType();

IsPublic IsSerial Name                                     BaseType                                                                                 
-------- -------- ----                                     --------                                                                                 
True     True     String                                   System.Object                                                                            

Что мне нужно было сделать объявляет $ user массивом 1 измерения и инициализирует его массивом 1 измерения:

[string]$user = ""
[string[]]$user = ("")
$user.GetType();

IsPublic IsSerial Name                                     BaseType                                                                                 
-------- -------- ----                                     --------                                                                                 
True     True     String[]                                 System.Array   

или запускает новый сеанс Powershell, где $ user не был ранее объявлен и создан. Это также сработало.

Как я уже говорил, я новичок в Powershell и все еще учусь.

Я также провел некоторое время в этом Вопросе и ответах, чтобы получить некоторое представление о том, как очистить переменные в shell - интересно.

powershell - Удалить все переменные

1 Ответ

3 голосов
/ 08 марта 2020

Я сожалею, что не могу воспроизвести вашу ошибку, так как мой вывод не разделен.

[string[][]] $adusers = (
     ( "John", "Smith", "jsmith", "jsmith@smitty.com" ),
     ( "James", "Johnson", "jjohnson", "jjohnson@smitty.com" )
)

ForEach ($user in $adusers){

    $adusers.GetType();
    $user.GetType();

    $user[0]
    $user[1]
    $user[2]
    $user[3]

}

IsPublic IsSerial Name                                     BaseType                                                                                                      
-------- -------- ----                                     --------                                                                                                      
True     True     String[][]                               System.Array                                                                                                  
True     True     String[]                                 System.Array                                                                                                  
John
Smith
jsmith
jsmith@smitty.com
True     True     String[][]                               System.Array                                                                                                  
True     True     String[]                                 System.Array                                                                                                  
James
Johnson
jjohnson
jjohnson@smitty.com

PS C: \ Users \ username> Get-Host

Name             : Windows PowerShell ISE Host
Version          : 5.1.17134.858
InstanceId       : 4c82dfcb-cdf7-4eb5-8c0a-25d2ad359ba3
UI               :   System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : de-DE
CurrentUICulture : de-DE
PrivateData      : Microsoft.PowerShell.Host.ISE.ISEOptions
DebuggerEnabled  : True
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace
...