1. ホーム
  2. スクリプト・コラム
  3. パワーシェル

PowerShell 配列の複数の入力メソッド

2022-02-04 19:56:50

この要望はキャメロット社から出されたものです。Microsoft Cloud Solutions Exchange 236804566 premium group のユーザーの方々の貢献に感謝します。
まず、標準的な配列がどのように入力されるかを見てみましょう。

PS D:\> $arr= "adf","asdfer","sredsaf"
 
PS D:\> $arr
adf
asdfer
sredsaf

ここで注意すべきは、ダブルクォートとカンマで区切っていることです。言うまでもなく、これが最も簡単な入力方法ですが、使い勝手が悪く、ユーザー自身がPowerShellスクリプトを変更する必要があります

ユーザーが簡単に操作できるようにするために、次のような例を書きました。

$changdu = Read-Host("Please enter the length of the data in the array")
$s1= "@{"
for($x=0; $x -le $changdu-1; $x++)
{if($x -ne 0)
  { 
  $servers = Read-Host('"Enter the name of the computer to add')
  $s1 = $s1+$x+'="'+$servers+'";'
  $s1
   }
if($x -eq 0) 
  {
  $servers = Read-Host('Enter first computer name')
  $s1 = $s1+$x+'="'+$servers+'";'
  $s1
 }}
$s1 = '$arr='+$s1+"}"
$s1
echo xx |Out-File d:\3456.ps1
$files = (Get-Childitem d:\3456.ps1).pspath
clear-content $files
add-Content $files -Value "$s1"

実行すると、次のような結果になります。

Please enter the length of the data in the array: 4
Enter the first computer name: asdf
@{0="asdf";
"Enter the name of the computer to be added: ert
@{0="asdf";1="ert";
"Enter the name of the computer you want to add: 2345
@{0="asdf";1="ert";2="2345";
"Enter the name of the computer to add: gadf
@{0="asdf";1="ert";2="2345";3="gadf";
$arr=@{0="asdf";1="ert";2="2345";3="gadf";}
 
PS D:\> $arr=@{0="asdf";1="ert";2="2345";3="gadf";}
 
PS D:\> $arr
 
Name Value                                 
---- -----         
3 gadf   
2 2345   
1 ert   
0 asdf

最終的に出力されるのは文ですが、文は配列ではなく文字列なので、別のファイルに出力して別途実行します。

$arr=@{0="asdf";1="ert";2="2345";3="gadf";} のようになります。

以下のコマンドを実行するだけです。もちろん、この行は上のスクリプトに追加することもできます。

powershell d:\3456.ps1

新しいファイルを作成する必要があり、効率が悪いという問題がありますが、ループを使うので、まだユーザーエクスペリエンスは良いので、気分転換にスプリット方式を試してみましょう。

$arr=(read-host("Please enter name of VM to be created, multiple VMs separated by commas in English state")).Split(',')

ここでは、データを分離して配列にするのに適したsplitメソッドが使用されています。splitメソッドについては、以下のリンクに詳しく書かれていますので、ここでは割愛します。

https://www.jb51.net/article/69147.htm

そうすると、上のスクリプトを修正して、splitメソッドを使用することもできます。この場合、現在のスクリプトで出力することができ、また、ユーザーがダブルクォートと

$changdu = Read-Host("Please enter the length of the data in the array")
$s1= ""
for($x=0; $x -le $changdu-1; $x++)
{if($x -ne 0)
  { 
  $servers = Read-Host('"Enter the name of the computer to add')
  $s1 = $s1+$servers+';'
  $s1
   }
if($x -eq 0) 
  {
  $servers = Read-Host('Enter first computer name')
  $s1 = $s1+$servers+';'
  $s1
 }}
$s2 = ($s1).Split(';')
echo $s2

また、.netのメソッドを使用してこれを処理する別の方法があり、これはビジュアルが悪いですが、うまく機能します。

コピーコード コードは以下の通りです。

$bb2= New-Object System.Collections.ArrayList
$bb2.Add("First")
$bb2.Add("second")

出力はこのようになり、この方法がよりシンプルであることがわかります。また、少し修正すれば、インタラクティブなエントリにすることも可能です。

コピーコード コードは以下の通りです。

PS D:\> $bb2
First
The second

要約すると、この問題を解決するには少なくとも4つの方法があるはずです。

1. 文字列をテキストに出力し、PowerShellで実行する xxx.ps1
2. splitメソッドで文字列を処理し、配列に切り出す
3, 相互作用のない直接的な1文の処理
4、netメソッド処理

この記事は "Nine Uncles - Microsoft Private Cloud" のブログから引用しています。