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

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

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

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

PowerShell

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

Q&A

解決済

1回答

4212閲覧

PowerShellの変数の扱いについて。(同じ"文字列"なのに動作が違う)

mie.8

総合スコア28

Windows 7

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

PowerShell

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

0グッド

0クリップ

投稿2017/06/22 01:06

編集2017/06/22 02:29

前提・実現したい事

XMLファイルの中から、任意のタグのみ抜き出したい。

【方法】
Excelに、抜き出したいタグを記入。(A1から下方向に向かって記入。A1~A10みたいな)
PowerShellを使用し、「XMLファイル」と「Excelファイル」を読み込み、Excelファイル中に記載されているタグを、別名付けて保存したいです。

【参照元XMLファイル】Original_XML.xml

XML

1<?xml version="1.0" encoding="utf-8"?> 2<EXP_HogehogeWorkDataTable> 3 <DocumentElement> 4 5 <EXP_HogehogeWork id="EXP_HogehogeWork1"> 6 <RecordId>00000055643</RecordId> 7 <Title>自己紹介1</Title> 8 <Name>田中太</Name> 9 <From>日本</From> 10 <BloodType>A</BloodType> 11 <Height>156cm</Height> 12 <BodyWeight>120kg</BodyWeight> 13 <LastUpdateDate>2015-04-20T11:13:59.000+09:00</LastUpdateDate> 14 </EXP_HogehogeWork> 15 16 <EXP_HogehogeWork id="EXP_HogehogeWork2"> 17 <RecordId>00000925544</RecordId> 18 <Title>自己紹介2</Title> 19 <Name>砂糖一</Name> 20 <From>パリ</From> 21 <BloodType>B</BloodType> 22 <Height>185cm</Height> 23 <BodyWeight>56kg</BodyWeight> 24 <LastUpdateDate>2015-04-21T11:23:45.000+09:00</LastUpdateDate> 25 </EXP_HogehogeWork> 26 27 <EXP_HogehogeWork id="EXP_HogehogeWork3"> 28 <RecordId>00000007048</RecordId> 29 <Title>自己紹介3</Title> 30 <Name>関克也</Name> 31 <From>ドイツ</From> 32 <BloodType>O</BloodType> 33 <Height>174cm</Height> 34 <BodyWeight>76kg</BodyWeight> 35 <LastUpdateDate>2015-04-21T20:12:02.000+09:00</LastUpdateDate> 36 </EXP_HogehogeWork> 37 38 <EXP_HogehogeWork id="EXP_HogehogeWork4"> 39 <RecordId>00001611089</RecordId> 40 <Title>自己紹介4</Title> 41 <Name>山田花子</Name> 42 <From>イタリア</From> 43 <BloodType>AB</BloodType> 44 <Height>160cm</Height> 45 <BodyWeight>67kg</BodyWeight> 46 <LastUpdateDate>2015-04-23T13:23:08.000+09:00</LastUpdateDate> 47 </EXP_HogehogeWork> 48 49 </DocumentElement> 50</EXP_HogehogeWorkDataTable>

【タグ一覧Excelファイル】XML_TagList.xlsx
![Excelの中身

実際のソースコード

PowerShell

1<# 変数宣言 #> 2$XmlFilePath = "C:\powershell\Original_XML.xml" # "XML" 参照先 3$XmlSavePath = "C:\powershell\Create_XML.xml" # "XML" 保存先 4$ExcelFilePath = "C:\powershell\XML_TagList" # "Excel" 参照先 5$sheet_No = 1 # シート番号 6$ex_GyouNo = 1 # 取得対象:開始行番 7$ex_RetsuNo = 1 # 取得対象:開始列番 8$ex_Alphabet = "A" # "Excel" の「列A」を指定 9$TagName = $null # 初期化 10 11<# 処理開始 #> 12try { 13 # Excelオブジェクト作成 14 $excel = New-Object -ComObject Excel.Application 15 $excel.Visible = $false 16 17 # 参照先Excel指定 18 $book = $excel.Workbooks.Open($ExcelFilePath) 19 20 # シート名指定(番号で指定) 21 $sheet = $excel.Worksheets.Item($sheet_No) 22 23 # 処理回数取得(A列より取得) 24 $rows = $sheet.UsedRange.Rows.Count 25 foreach ( $max in $ex_Alphabet ) { 26 $col = $excel.WorksheetFunction.CountIf($sheet.Range($max + "1:" + $max + $rows), "<>") -1 27 } 28 29 # 項目取得 30 for ($i = 0; $i -lt $col; $i++) { 31 $TagName += '"' + $sheet.Cells.Item($i + $ex_GyouNo, $ex_RetsuNo).Text + '"' 32 33 <# 最後のタグ文字を取得したら終了 #> 34 if ($i -eq $col -1) { # 最後のループ処理か判断 35 break # break:ループ処理終了 36 } 37 else { 38 $TagName += "`," # タグ文字の最後にカンマ追加 39 } 40 } 41 42 # Excelを閉じる 43 $excel.Quit() 44} 45catch { 46 write-host "info: $($_.Exception.Message)" -foregroundcolor red 47 48} finally { 49 # null 50 $excel, $book, $sheet | ForEach-Object{$_ = $null} 51 52 # オブジェクトの破棄 53 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) 54 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($sheet) 55 [System.GC]::Collect() 56} 57 58# XMLファイル読み込み 59$xml = [xml](Get-Content $XmlFilePath) 60 61<#========== 問題部分 ==========#> 62 63# XMLタグ抜き出し 64$CustomXML = $xml.EXP_HogehogeWorkDataTable.DocumentElement | 65 ForEach-Object { 66 $_[$TagName].OuterXml 67 } 68<#========== 問題部分 ==========#> 69 70# ファイル出力 71$CustomXML | Out-File $XmlSavePath

ソースの説明としては、
①XML_TagList.xlsx から、タグ名を「変数:$TagName」に、【"RecordId","Name","From"】の形で取得。
②XMLファイルを読み込み、先程Excelから取得したタグ名を「変数:$TagName」指定し、取得。

発生している問題・Error Message

上記ソースコードを実行すると、エラーも出ず、別名でファイル保存が出来るのですが、作成したファイルを見てみると何も書かれていませんでした。

問題部分 と囲ったコード部分を、

PowerShell

1<#========== 処理成功例 ==========#> 2 3# XMLタグ抜き出し Pattern1 4$CustomXML = $xml.EXP_HogehogeWorkDataTable.DocumentElement | 5 ForEach-Object { 6 $_["RecordId"].OuterXml 7 $_["Name"].OuterXml 8 $_["From"].OuterXml 9 } 10 11# -------------------------------------------------------- # 12 13# XMLタグ抜き出し Pattern2 14$TagName = "RecordId","Name","From" 15$CustomXML = $xml.EXP_HogehogeWorkDataTable.DocumentElement | 16 ForEach-Object { 17 $_[$TagName].OuterXml 18 } 19 20# -------------------------------------------------------- # 21 22# XMLタグ抜き出し Pattern3 23$CustomXML = $xml.EXP_HogehogeWorkDataTable.DocumentElement | 24 ForEach-Object { 25 $_["RecordId","Name","From"].OuterXml 26 } 27<#========== 処理成功例 ==========#>

の様に書くと正常に取得出来ます。

  • パターン1では、タグ名を手入力により指定。
  • パターン2では、変数にタグ名を入れ、変数を指定。
  • パターン3では、パターン1の様に1ずつ記載では無く、まとめて指定。

試した事

「変数に文字列を代入した場合」 と 「Excelから取得した値(文字)」 は、型が変わるのかと思い

PowerShell

1[string]$TagName # 文字型指定 2$TagName = @() # 配列指定

の様に、文字型指定してもダメでした。

パターン2の様に、変数に文字列を代入した場合は取得が出来、
Excelから取得した場合は失敗する理由が分かりません。
どなたか、ご教示頂ければと思います。
よろしくお願い致します。

補足情報(言語/FW/ツール等のVersion)

・PowerShell ver5.0
・Windows 7
・Excel拡張子(主に扱うのは、".xls" と ".xlsx")

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

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

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

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

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

guest

回答1

0

自己解決

PowerShell

1for ($i = 0; $i -lt $col; $i++) { 2 $TagName += $sheet.Cells.Item($i + $ex_GyouNo, $ex_RetsuNo).Text 3 }

Excelから値を取得する際に、「文字列」では無く、【配列】にした所出来ました。

投稿2017/06/22 03:49

mie.8

総合スコア28

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問