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

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

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

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PowerShell

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

配列

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

Q&A

解決済

2回答

878閲覧

一部の値を別の列に表示させる方法

-Yam-

総合スコア12

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PowerShell

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

配列

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

0グッド

0クリップ

投稿2021/07/13 06:54

編集2021/07/27 10:38

「main.ps1」「Directory.pms1」を実行すると⓵のように表示されます。
Folder2フォルダ内にあるファイルを⓶のように『Folder2』列に表示できる方法を教えてください。

使用PC:Windows10
powershellバージョン:Visual Studio Code5

パス:C:\Dir\Folder1\File1,File2,File3    C:\Dir\Folder2\File1,File2,File3 ⓵現在表示されている配列 Folder1 Folder2        --------- ---------         File1                 File2                 File3                    File1              File2 File3    ↓ ↓ ↓   ⓶表示させたい配列 Folder1 Folder2 --------- --------- File1 File1 File2 File2 File3 File3    

###main.ps1

PowerShell

1using namespace System.Collections.Generic; 2using Module .\Directory.pms1 #Directory.pms1を呼び出し、処理をさせる 3 4#Directory配列を作成し、各列に"Folder1"フォルダ内のファイル"を代入 5$Directory = New-Object Directory 6 7#.\Dir内にある『Folder1』『Folder2』各フォルダ内のファイル名を全て読み込み 8$Dir = Get-ChildItem -Recurse -File ".\Dir" | Select-Object FullName 9 10foreach ($i in $Dir){ 11 [string]$str = $i 12 $Directory.Add($str.Split("\")[-1].replace("}",""),"") 13 14}

Directory.pms1

PowerShell

1using namespace System.Collections.Generic; 2 3Collections.Generic 4class Directory 5{ 6 # 配列を新規作成 7 Directory() { 8 $this.list = New-Object 'List[PSCustomObject]' 9 } 10 11 [List[PSCustomObject]]$list 12 13 # Directory配列に1件データを追加する 14 [void] Add([string]$p1, [string]$p2) { 15 $ps = [PSCustomObject]@{Folder1 = $p1; Folder2 = $p2} 16 $this.list.Add($ps) 17 } 18} 19

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/07/13 07:09

PowerShell の話ですか? であれば、C# のタグは外していただきたいのですが。C# のタグを頼りに Teratail を見ている閲覧者にとっては、はっきり言ってノイズになるので迷惑と思います。
-Yam-

2021/07/13 07:18

教えていただき、ありがとうございます。 powershellの話です。先程、タグを外しました。 ご迷惑をお掛けし、申し訳ございませんでした。
YAmaGNZ

2021/07/27 10:59

そもそも別物のリストなのだからListも複数作れば考え方が簡単なのでは? 表示は最大件数でループしてそれぞれを連結すればいいのだし。
guest

回答2

0

ベストアンサー

$Directory.Add($str.Split("\")[-1].replace("}",""),"")
のところが問題ですね

$Directory.Add(<Folder1>,<Folder2>)
と指定しないといけないところが

$Directory.Add(<Folder1>,"")
となっていますよ

私はFolder2に何を入れたいのか知らないので正解は答えられません、
しかし、仮に正しくこれを指定しても下記のようになってしまうと思います。

Powershell

1list 2---- 3{@{Folder1=1; Folder2=2}} 4{@{Folder1=1; Folder2=2}} 5{@{Folder1=1; Folder2=2}} 6{@{Folder1=1; Folder2=2}}

好みがあると思うので何とも言えませんが、
クラスは単品のアイテムとして定義し、
使用する側でListを使用したほうが
目的の出力に近づくかと...

あと#.\Dir内のフォルダ、ファイル名全て読み込み
って書いてあるのに-Fileでファイルだけに絞っているのが気になります...

Folder1を直近上位のディレクトリ
Folder2はフォルダじゃなくてファイルのフルパス
と仮定すると下記のようになります。

Powershell

1Class Directory{ 2 [String]$Folder1 3 [String]$Folder2 4 5 Directory([String]$p1,[String]$p2){ 6 7 $This.Folder1 = $p1 8 $This.Folder2 = $p2 9 } 10} 11 12 13# Directory配列を作成 14$Directory = [System.Collections.Generic.List[Directory]]::new() 15 16# .\Dir以下のファイルを再帰的に取得 17$Files = Get-ChildItem -Recurse -File ".\Dir" 18 19# 20foreach ($i in $Files){ 21 $Directory.Add([Directory]::new($i.Directory.Fullname,$i.Fullname)) 22} 23 24# 結果の確認 25$Directory

-- 追記 --
対象フォルダ直下のフォルダ毎に
列を作って中のファイルを盾に並べたいってことでしょうか

リストでやったほうが変換も出来て便利ですよ
サンプルおいておきます。

PowerShell

1#対象フォルダ 2$TargetName = ".\Dir" 3 4# 対象フォルダオブジェクト化(対象フォルダの相対パス指定対応のため) 5$Target = gi $TargetName 6 7# 直下のフォルダのみ取得 8$Target|ls -dir|%{ 9 # 初回実行時にリストを用意 10 $Files = [System.Collections.Generic.List[pscustomobject]]::new() 11}{ 12 # 直下のディレクトリをキープ 13 $Dir = $_ 14 15 # 再帰的に全てのファイルを取得 16 $Dir|ls -rec -file|%{ 17 # インデックスをリセット 18 $i = 0 19 }{ 20 # 指定インデックスが無ければ 21 if($i -ge ($Files.Count -1)){ 22 # オブジェクトを追加 23 $Files.add([pscustomobject]@{}) 24 } 25 26 # 直下のフォルダ名でプロパティを追加 27 # 追加プロパティの値に 直下のフォルダのフルパスを除いた ファイルのパスを指定 28 $Files[$i]|Add-Member $Dir.Name $($_.FullName.Replace("$($Dir.FullName)\","")) 29 30 # インデックス カウントアップ 31 $i++ 32 } 33} 34 35# 結果の出力 36$Files|ft -AutoSize 37 38# CSV変換も可能 39$Files|Export-Csv -Path "$($Target.FullName)\FileList.csv" -Encoding UTF8 -NoTypeInformation

投稿2021/07/27 09:31

編集2021/07/27 12:20
kamikazelight

総合スコア305

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

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

-Yam-

2021/07/27 10:57 編集

kamikazelightさん 詳しく教えていただき、ありがとうございます。 $Directory.Add($str.Split("\")[-1].replace("}",""),"")が主に原因なのですね。 各列に表示させたいのは 『Folder1』列→Folder1ディレクトリ内のファイル(File.1,File.2,File.3) 『Folder2』列→Folder2ディレクトリ内のファイル(File.1,File.2,File.3) です。 ================================ フルパスの場合 Folder1          Folder2 ---------         --------- C:\Dir\Folder1\File1 C:\Dir**Folder2**\File1 C:\Dir\Folder1\File2 C:\Dir**Folder2**\File2 C:\Dir\Folder1\File3 C:\Dir**Folder2**\File3  ================================ 上記のように表示させるために、foreach文で最初から指定させる前にif文で<Folder1列><Folder2列>に表示させたいファイルを値に入れるように載せていただいたソースを参考にやってみようと思います。 >あと#.\Dir内のフォルダ、ファイル名全て読み込み >って書いてあるのに-Fileでファイルだけに絞っているのが気になります... →こちらですが、誤っておりました。誤った情報を載せてしまい、申し訳ございません。  正しくは『#.\Dir内のファイル名全て読み込み』です。こちらは修正させていただきます。
kamikazelight

2021/07/27 12:13

なんとなくやりたそうなことが分かったので 追記でサンプル載せておきました
-Yam-

2021/07/30 09:57

kamikazelightさん 実際にやりたいことが出来ました! 丁寧にサンプル載せていただき、ありがとうございます。
guest

0

$Directory.Addの第二引数(Forder2)に""を指定しちゃってますよ?

投稿2021/07/24 12:19

kamikazelight

総合スコア305

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

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

-Yam-

2021/07/26 09:23

kamikazelightさん ご回答いただきありがとうございます。 上記のように移動させるにはどれを指定させればよいのでしょうか。 powershell初心者のため、知識が少なくて申し訳ございません。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問