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

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

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

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

Q&A

解決済

1回答

4178閲覧

【PowerShell】配列として格納されたテキスト群をToStringメソッドを噛ませた後、リダイレクトしてテキストに出力する際に複数、要素が存在する場合正しく出力されない。

beginner_Jiro

総合スコア10

PowerShell

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

0グッド

0クリップ

投稿2020/03/25 09:03

編集2020/03/25 09:05

いつもお世話になっております。

PowerShellスクリプトについてご教授ください。

検索元であるファイルAからSelect-Stringメソッドを使用して
ヒットした文言を一行単位で配列としてオブジェクトに格納しました。

そのオブジェクト内にあるテキスト群をリダイレクトでテキストファイルに出力したところ
Microsoft.PowerShell.Commands.MatchInfoオブジェクトによる影響?で改行が行われました。
(PowerShellの画面バッファーの設定に依存するとのこと)
改行を防ぐためにTo_stringメソッドを使用して改行を防いだのですが、
配列内に複数要素が存在する場合(Select-Stringで二行以上検索文言が発見された場合)、
System.Object[]とテキストファイルに出力されていしまいます。

配列の要素が複数存在する場合、リダイレクトにそのまま出力できないのでしょうか?
もしも、オブジェクトとして以外でSelect-Stringの返却値を返す方法があるなど
解決策がございましたらご教授願えますでしょうか。

以下、ソースの抜粋になります。

function

1{ 2 #設定ファイルの一行分(検索文言)をRead-iniから受け取る 3 param($_line_1,$_DayFile1) 4 echo $_line_1 5 echo $_DayFile1 6 #各変数を用意してリダイレクトで作業ファイルに書き出し 7 $_wrkfile = $_wrkpath + $_DayFile + "Tgtwrd.txt" 8 $_flepath = $_logpath + "\" + $_DayFile 9 $_wrkobj = Get-Content $_flepath | Select-String $_line_1 10 11 #検索文言が調査対象ファイルに存在した場合のみ後続処理を行う 12 if($_wrkobj -ne $_null) 13 { 14 $_wrkobj.GetType().FullName 15 $_wrkobj >> $_wrkfile 16 ($_wrkobj).ToString() >> $_wrkfile 17 } 18} 19コード

以上になります。よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

このように要素をそれぞれ文字列化してみてください。

PowerShell

1$_wrkobj | Foreach-Object ToString >> $_wrkfile

投稿2020/03/25 09:26

Zuishin

総合スコア28660

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

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

beginner_Jiro

2020/03/25 09:49

Zuishin様 ご回答いただきありがとうございます。 ご教授いただいた内容でワークファイルに出力することができました。 自分の方でも質問後すぐにソースを修正して 下記のような内容で出力成功しておりましたが少々不安でした if($_wrkobj -ne $_null) { foreach($_wrkobjLine in $_wrkobj) { $_wrkobjLine.GetType().FullName $_wrkobjLine >> $_wrkfile ($_wrkobjLine).ToString() >> $_wrkfile } } ご教授いただいた内容は上記とパイプで渡すか否かの違いだとは思うのですが、 上記と処理速度の変化はあるのでしょうか? ご教授いただいた内容の方がはるかにスマートですので実装は頂いたコードで行おうと思うのですが よろしければお答え願えればと思います。
Zuishin

2020/03/25 10:13

https://qiita.com/acuo/items/9928e1fbb31b238d9705 計測した人がいますが、50 万回ループしたところ foreach 文は 381ms Foreach-Object は 4406ms で foreach 文の方が圧倒的に速いですね。ただしこのように数十万のオーダーでループしない限り差はほとんど体感できないと思います。50 万回では 4 秒の差がつくのでさすがに体感してわかりますが、待てない時間ではないので、どちらを使うかは速度ではなくどちらの方がコードが保守しやすくなるかで決めればいいのではないかと思います。 両者は break に対する挙動が違うので、入れ替える際には気を付けなければいけません
beginner_Jiro

2020/03/26 08:00

Zuishin様 丁寧にご回答いただきありがとうございます。 foreachとoreach-Objectでは別物ですね・・・。もっと勉強いたします。 また、各アドバイスも頂きありがとうございます。 観点として処理の速度だけで見ておりました。 上記内容、実装の際の参考にさせていただきます。 以上になります。ご回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問