質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

11849閲覧

powershellの配列について

roku28632

総合スコア36

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/02/11 05:20

powershellの配列について

あるフォルダのファイルの名前を配列に順番に入れていきたいのですが、うまくいきません。
なぜか、要素数が1つの状態で、各ファイル名がつながった状態で格納されます。

lang

1$sh = New-Object -ComObject Shell.Application 2 3#フォルダ取得 4$f = $sh.Namespace('C:\work\ps_practice\test') 5 6#ファイル名の一覧を取得 7$fileList = Get-ChildItem('C:\work\ps_practice\test\') -Name 8 9[string]$array = @() 10 11foreach($file in $fileList){ 12 $array += $file;} 13 14$array.Count 15$array 16

PS C:\Users\aaa> C:\work\ps_practice\20200211_test.ps1
1
aaa.txtbbb.txtccc.txtddd.txteee.txtfff.txtggg.txt

また、回避策として、要素数を指定して実行すればうまくいくのではないかと考えましたが、エラーになってしまいました。

lang

1$sh = New-Object -ComObject Shell.Application 2 3#フォルダ取得 4$f = $sh.Namespace('C:\work\ps_practice\test') 5 6#ファイル名の一覧を取得 7$fileList = Get-ChildItem('C:\work\ps_practice\test\') -Name 8 9[string]$array = @() 10 11$i = 0 12 13foreach($file in $fileList){ 14 $array[$i] += $file; 15 $i += 1 16} 17 18$array 19

PS C:\Users\aaa> C:\work\ps_practice\20200211_test.ps1
型 System.String のオブジェクトにインデックスを付けることはできません。

原因と対処方法について教えてください

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/02/11 05:47

[string[]]$array = @()
roku28632

2020/02/11 06:13

おー、すごい。 できました。ありがとうございまます。 ちなみに、[string]$array = @() これだと、文字列が追加されていくのは、そもそも配列になってなかったということでしょうか??
Zuishin

2020/02/11 06:15

そうです。文字列型になります。
roku28632

2020/02/11 06:46

なるほど。 空の配列だと、$array = @()なので、@があると、配列宣言になりそうなのですが、なぜ、ただの変数になるんでしょうか。 あと、上の回答がなくても、できればベストアンサーにしたいので、よければ回答に初めのコメントを書いてもらえないでしょうか。
guest

回答1

0

ベストアンサー

ps1

1[string]$array = @()

これですが、変数 $array を string 型の変数として定義する構文です。
@() は配列ですが、string 型の変数に代入されることによって string 型に変換されています。

次のように書くことで、$array を string[] 型、つまり string 型の配列の型の変数として宣言できます。

ps1

1[string[]]$array = @()

なお、PowerShell の配列は型を指定しなければ任意のオブジェクトを保持できます。次のように書いても結果は同じになるはずです。

ps1

1$array = Get-ChildItem 'C:\work\ps_practice\test\' -Name

投稿2020/02/11 07:00

Zuishin

総合スコア28669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

roku28632

2020/02/11 08:06

完璧です。 ありがとうございます。 文句なしのベストアンサーにさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問