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

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

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

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

PowerShell

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

Windows Server

Windows Serverとは、Microsoft社のサーバ用オペレーティングシステムの総称です。 企業内ネットワークなどで利用されるサーバ機へ導入することを想定して開発されているため高い安定性があり、 管理機能を提供するソフトウェアが多く含まれています。

Q&A

解決済

2回答

718閲覧

[PowerShell] 値を格納された変数から型を変えずに変数名を取得する方法

Oramun

総合スコア76

Windows

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

PowerShell

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

Windows Server

Windows Serverとは、Microsoft社のサーバ用オペレーティングシステムの総称です。 企業内ネットワークなどで利用されるサーバ機へ導入することを想定して開発されているため高い安定性があり、 管理機能を提供するソフトウェアが多く含まれています。

0グッド

0クリップ

投稿2017/05/23 07:40

編集2017/05/23 07:48

変数の中に取得した情報を格納し、そのデータをファイルに吐き出すスクリプトを作成中です。
取得する情報が複数ある為、ファイル名を動的に指定できないかと思って以下の方法をご教授頂きました。

PowerShell

1# 出力処理の定義 2function Export ($Dete) { 3 $Export = "$Path\$Dete.txt" 4 Get-Variable -ValueOnly $Dete | Format-Table -AutoSize | Out-File $Export 5} 6 7# アダプター情報取得 8$Adapter = Get-NetAdapter | Select-Object * 9Export ("Adapter")

この方法だと型が変わってしまっていたのですが、なぜでしょうか?

$Adapter.GetType().FullNameで確認した場合、System.Object[]System.Stringへと変わってしまっていました。

型が変わってしまう理由、もしくは回避方法をご教授下さい。

宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

「型が変わってしまう」のは、どの時点の話ですか?

データをファイル出力する過程でですか? それとも保存されたファイルの内容のことを言っているんでしょうか?

投稿2017/05/23 08:25

編集2017/05/23 08:27
hidori

総合スコア402

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

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

Oramun

2017/05/23 08:36

hidori さん 回答ありがとうございます! 「[Object]$変数名」という様に明示的に指定すれば解決しますか? また上記の例のコマンドだとどの様に指定すればいいでしょうか・・。
hidori

2017/05/23 09:01

すみません、「型が変わる」の主語が不明確で回答に窮します。 >「[Object]$変数名」という様に明示的に指定すれば解決しますか? についても同様です。 「なに(どれ)」に対して型を明示すればいい、と言っているんでしょう?
Oramun

2017/05/23 09:21

すいません、うまく答えられないのですが・・ 今回はテキスト形式での出力ですが、XML形式の出力にも対応させたいと思っています。 何か情報を操作したい場合は、その出力したファイルをインポートしてオブジェクト型であれば情報操作ができると考えています。 そのため、取得した状態と同じ状態(オブジェクト型のまま)出力したいと思って、質問させて頂きました。 上記のコマンドに +α で対応できるのなら是非とも教えて頂きたいです。 質問の解とはなっていませんが、ご教授頂けたらと思います。 宜しくお願い致します。
hidori

2017/05/23 09:48 編集

> すいません、うまく答えられないのですが・・ ↑のコードで「x行目のxという名前の変数の値の型が想定と異なっています」と答えることは、難しい事なんでしょうか? > 何か情報を操作したい場合は、その出力したファイルをインポートしてオブジェクト型であれば情報操作ができると考えています。 そもそもの目的は何ですか? Get-NetAdapter の結果をファイル保存して、それを型情報付きで復元できたとして、ネットアダプターの装着状態まで復元は出来ないですよね? Get-NetAdapter は、「情報を型情報含めて正しくファイル保存して、ファイル読み込みによって型情報付きで情報鵜を復元する」という処理手順を学習するためにたまたま使用しているだけですか? もしそうだとすると、Get-Adapter の結果はコンピュータに装着されているハードウェア構成を反映した情報であるため、「データの保存と復元」の学習で扱う対象としては適切でないです。
Oramun

2017/05/23 10:00

下記の「$**.GetType().FullName」に差異がある点については、Zuishin さんに回答頂き納得しました。 ============================ # 情報取得日時 $InfoDate = Get-Date -Format "yyyyMMddHHmm" # スクリプト実行パスの取得 $CommandPath = Split-Path $Script:MyInvocation.MyCommand.path -parent # ファイル出力処理 function Export ($Data) { $Data.GetType().FullName ← 「ここではストリング型」 $Export = "$CommandPath\$Data" + "_" + "$InfoDate.txt" Get-Variable -ValueOnly $Data | Format-Table -AutoSize | Out-File $Export } # アダプター情報取得 $Adapter = Get-NetAdapter | Select-Object * $Adapter.GetType().FullName ← 「ここではオブジェクト型」 Export ("Adapter") ==================================== Get-NetAdapter はたとえの為だけに使用していました。 「復元」を目的としている訳ではなく、例えば何千行もある情報から1行を抜き出したい場合などにインポートして操作して目的のデータを取り出したいと考えています。 上記のコマンドにこだわらなくてもかまいません。 「$Adapter = Get-NetAdapter | Select-Object *」の様にオブジェクト型で取得した情報を、そのまま(型を変更せずに)出力したいだけです。
hidori

2017/05/23 10:12

>上記のコマンドにこだわらなくてもかまいません。 >「$Adapter = Get-NetAdapter | Select-Object *」の様にオブジェクト型で取得した情報を、そのまま(型を変更せずに)出力したいだけです。 なるほど、目的は「シリアライズ/デシリアライズ(操作)の学習」ということですね。 対象が広く「オブジェクト型」だとすると、(厳密には)出来る場合と出来ない場合があります。 取得することが出来ても、ファイル保存された情報から、取得時とまったく同じ状態を再現するのが非常に困難なケースもあるからです。 対象の「型」が * 文字列や数値などの単純な型 * ハッシュと配列 また * 上記の型のみをメンバに持つ PSObject 型 程度に限定すれば、比較的容易です。
Oramun

2017/05/23 10:17

hidori さん 回答ありがとうございます。 > 対象の「型」が > * 文字列や数値などの単純な型 > * ハッシュと配列 > また > * 上記の型のみをメンバに持つ PSObject 型 > 程度に限定すれば、比較的容易です。 上記の条件に限定した場合だと、どうようにすればいいでしょうか。 サンプルコード、もしくは参考サイトなどなんでも構いません。 ご教授ください。よろしくお願い致します。
hidori

2017/05/23 14:44 編集

例えば、PowerShell の JSON サポートを使用して書くとこんな感じです。 ```powershell # ハッシュの配列を作成する $SourceHashArray = @( @{ Name = "Taro"; Age = 10 } @{ Name = "Ichiro"; Age = 11 } @{ Name = "Jiro"; Age = 12 } @{ Name = "Sabro"; Age = 13 } ) "-- SourceHashArray --" $SourceHashArray "" # ハッシュの配列から PSObject の配列を作成する $SourceObjectArray = $SourceHashArray | ForEach-Object { New-Object -Type PSObject -Property $_ } "-- SourceObjectArray --" $SourceObjectArray "" # PowerShell の JSON サポートを使用して PSObjec の配列を JSON 形式の文字列に変換する $JsonString = ConvertTo-Json -InputObject $SourceObjectArray "-- JsonString --" $JsonString "" # PowerShell の JSON サポートを使用して JSON 形式の文字列から PSObject の配列を(新たに)作成する $RestoredObjectArray = ConvertFrom-Json -InputObject $JsonString "-- RestoredObjectArray --" $RestoredObjectArray ```
Oramun

2017/05/23 10:42

hidori さん サンプルありがとうございます! 参考にさせて頂きます!
hidori

2017/05/23 14:45

↑変数名を改良、コメントを追加しました
guest

0

ベストアンサー

どこで変わるのでしょうか?
Format-Table で文字列になるのは仕様です。また $Dete は文字列です。

投稿2017/05/23 07:58

Zuishin

総合スコア28660

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

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

Oramun

2017/05/23 08:03

「$Adapter = Get-NetAdapter | Select-Object * 」で、取得した直後に先程のコマンド 「$Adapter.GetType().FullName」を実行すると「System.Object[]」と確認できます。 ですが、関数の内部で「$Export = "$Path\$Dete.txt"」を実行する前に「$Adapter.GetType().FullName」を実行すると「System.String」へと変わってしまっていました。 ここをオブジェクトのままで渡したいのですが、ちょっと分からなかったので再度質問させてもらいました ( ; ´・ω・)
Zuishin

2017/05/23 08:24

やってみましたが、再現しませんでした。具体的にどういうコードで再現しますか?
Oramun

2017/05/23 08:29

以下の様な処理を実行しています。 ============================ # 情報取得日時 $InfoDate = Get-Date -Format "yyyyMMddHHmm" # スクリプト実行パスの取得 $CommandPath = Split-Path $Script:MyInvocation.MyCommand.path -parent # ファイル出力処理 function Export ($Data) { $Export = "$CommandPath\$Data" + "_" + "$InfoDate.txt" Get-Variable -ValueOnly $Data | Format-Table -AutoSize | Out-File $Export } # アダプター情報取得 $Adapter = Get-NetAdapter | Select-Object * Export ("Adapter")
Zuishin

2017/05/23 08:36

GetType を含めてお願いします。このコードでは Adapter は変わらないと思います。$Data は文字列です。
Oramun

2017/05/23 08:40

以下の箇所で型を取得し確認してみました。 ============================ # 情報取得日時 $InfoDate = Get-Date -Format "yyyyMMddHHmm" # スクリプト実行パスの取得 $CommandPath = Split-Path $Script:MyInvocation.MyCommand.path -parent # ファイル出力処理 function Export ($Data) { $Data.GetType().FullName ← 「ここではストリング型」 $Export = "$CommandPath\$Data" + "_" + "$InfoDate.txt" Get-Variable -ValueOnly $Data | Format-Table -AutoSize | Out-File $Export } # アダプター情報取得 $Adapter = Get-NetAdapter | Select-Object * $Adapter.GetType().FullName ← 「ここではオブジェクト型」 Export ("Adapter")
Zuishin

2017/05/23 08:43

繰り返しになりますが、$Data は変数の内容ではなく変数名なので文字列です。$Adapter とは違うものが入っています。
Oramun

2017/05/23 08:45

きちんと理解していませんでした・・。 何度も回答頂き、助かりました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問