• ベストアンサー

powershellとiniファイル

ps1よりiniファイルを読み込むスクリプトを作成中です。 iniファイルには以下の記載をしています。 いわゆる連想配列です。 $info = @{} $info[0] = @{ host=testest1 ip=192.168.0.0 } $info[1] = [ host=testest2 ip=192.168.0.1 } 一方、ps1は以下の通り、コードを記述しています。 $INI_PATH = @(Split-Path $script:myInvocation.MyCommand.Path -Parent).Trim() $INI_FILE = "ini_test2.ini" $INI_FULLNAME = $INI_PATH + "\" + $INI_FILE $PARAMETER = @{} Get-Content $INI_FULLNAME | %{$PARAMETER += ConvertFrom-StringData $_} $host_info = $PARAMETER.info[0] #値格納 $host_info いざ、実行すると、 「ConvertFrom-StringData : データ行 '}' の形式が '名前=値' ではありません。」、「項目は既に追加されています。」とのエラーが出ます。 どのように変えればエラーがなくなりますでしょうか。 Powershellの初歩的な質問で申し訳ないのですが、ご回答をよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • luka3
  • ベストアンサー率74% (314/421)
回答No.2

ConvertFrom-StringData では、名前=値 のペアしか受け付けないのではないでしょうか。 やりたいことに近いのは下記のようなことなのかと思います。 Invoke-Expressionは、与えられた文字列をスクリプトそのものとして処理します。 便利な反面、余計なもの(極端に言えばハッキングコード)が入り込まないよう注意する必要があります。 -- ini_test2.ini $info = @(@{},@{}) $info[0] = @{ host="testest1"; ip="192.168.0.0" } $info[1] = @{ host="testest2"; ip="192.168.0.1" } -- ps1 $INI_PATH = @(Split-Path $script:myInvocation.MyCommand.Path -Parent).Trim() $INI_FILE = "ini_test2.ini" $INI_FULLNAME = $INI_PATH + "\" + $INI_FILE Get-Content $INI_FULLNAME -Raw | Invoke-Expression $host_info = $info[0] #値格納 $host_info

ptgapsokwave
質問者

お礼

ご回答ありがとうございます。 解決しました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • chie65535
  • ベストアンサー率44% (8549/19429)
回答No.1

$info[1] = [ は $info[1] = { ではありませんか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PowerShellのスクリプト実行方法

    PowerShellを勉強しようと思い、PowerShell ISEを起動して、色々なコマンドを実行していました。 今度はテキストエディタでコマンドを書いて、「myPSCommand.ps1」というファイルをCドライブ直下に配置しました。 下記のサイトを参考に環境変数にPATHを通しました。 http://www.oborodukiyo.info/PowerShell/v20/PS-EnviromentPath.aspx そして、ファイルをダブルクリックしたら、メモ帳が起動してきました・・・ 調べたら、下記のサイトが見つかりました。 http://www.atmarkit.co.jp/ait/articles/0709/20/news125.html セキュリティの為に、PowerShellからスクリプトを呼び出す必要があると書いてありました。 やりたい事は、あるファイルをバックアップしたいと思います。 スクリプトにコマンドを書き込んで、タスクスケジューラーで特定の時間がくると、ファイルをバックアップするような事をしたいと思います。 ただ、今の状態だとタスクスケジューラーに「myPSCommand.ps1」を指定すると、その時間がくるとメモ帳が開いてしまいます。 スクリプトのみが実行されるには、どのようにすればよろしいでしょうか?

  • iniファイル操作

    VB6.0について質問です。 iniファイルの操作で手詰まりましたのでお知恵をおかしください! VBからiniファイルのパスを読み取りそこへデータを保存するという一連です。 実現したいことはiniファイルで指定したドライブに パス名のフォルダが存在しない場合はその指定されたフォルダを作成したい。 ということです。 少々ややこしいですがお願いします>< 現在、以下のソースで実行処理を行っていますがうまくいきません。 iniファイルに指定されたドライブにパス名のフォルダがあるか 判断するにはどうしたらいいでしょうか? wordini = INIfile_read("host", "path") If Dir(wordini)="" Then MkDir wordini End If File1.Path = wordini iniファイルのパスは D:\abc

  • Powershellでzip圧縮が出来ない

    Powershellでzip圧縮しようとしているのですが、 ・Powershell ISEで実行すると正常に圧縮 ・コマンドプロンプトで実行すると、「圧縮(zip形式)フォルダーエラー」が発生し、圧縮できない という現象が発生しています。コマンドプロンプトで実行できるようにしたいのですが、原因がわからないので、御教示をお願いします。 ・環境 Windows XP SP3 Powershell 2.0 ・Powershellソース # 引数チェック # 引数の数が2以外の時は異常終了 if ($args.Length -ne 2 ) { write-host "引数エラー" exit 2; } # 圧縮zipファイル名 $ZipFilePath = $Args[0] # 圧縮対象ファイル名 $TargetItems = $Args[1] # 圧縮先パス存在チェック if((Test-Path (Split-Path $ZipFilePath -Parent)) -ne $True){ write-host "圧縮先パスエラー" exit 3; } # 圧縮対象ファイル存在チェック if((Test-Path ($TargetItems)) -ne $True){ write-host "圧縮対象ファイルエラー" exit 4; } # Zipファイルが存在する場合は削除 if(Test-Path -Path $ZipFilePath) { Remove-Item -Path $ZipFilePath } # Zipファイル作成 Set-Content $ZipFilePath ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) (dir $ZipFilePath).IsReadOnly = $false # Zipファイルにファイルを投入 $shell = New-Object -com Shell.Application $zipfile = $shell.NameSpace($ZipFilePath) $archivedItems = New-Object Collections.ArrayList # 圧縮対象ファイルの数だけループ foreach($item in ($TargetItems | %{Get-Item -Path $_})) { # ファイルをZipファイルに投入。圧縮処理は非同期なので、その終了を待つ。 $archivedItems.Add($item) | Out-Null $zipfile.CopyHere($item.FullName) while($true) { if($archivedItems.Count -eq $zipfile.Items().Count) { break } Start-Sleep -Seconds 1 } } write-host "処理終了" exit 0

  • PowerShellのスクリプト実行について

    PowerShellのスクリプト実行について PowerShellの勉強をしていますが、スクリプトを実行できません。。。 なんか、スクリプトの環境変数を設定するようですが、どこにも 設定方法がないです。。。。 もちろん、Set-ExecutionPolicy Unrestrictedは実行してあります。 以下日付と時間を表示するだけのスクリプトです。 ---------test.ps1--------- get-date get-time ---------------------------- スクリプトファイルの置き場所 ⇒ C:\script-test\test.ps1 ちなみに、スクリプトファイルを置いたディレクトリに移動して 実行しても、以下のようなメッセージが出て実行できませんでした。。 用語 'C:\script-test' は、コマンドレット、関数、スクリプト ファイル、または操作 可能なプログラムの名前として認識されません。名前が正しく記述されていることを確 認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してく ださい。 発生場所 行:1 文字:15 + C:\script-test <<<< .\test.ps1 + CategoryInfo : ObjectNotFound: (C:\script-test:String) []、Comma ndNotFoundException + FullyQualifiedErrorId : CommandNotFoundException どなたかご教授下さい。

  • Powershellのparamについて

    Powershellについて質問いたします。 自分で確かめた限りですが、paramとargsは同時に使用できないのでしょうか? 使用の仕方は $args.length param($引数1,$引数2.$引数3) といった形で、paramの前にargs定義があると下記のエラーがでて 用語 'param' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。 逆にparamがargsの前にあると値が取れていないみたいです。(args.lengthの値が0) Paramでlengthのようなことができればいいのですが。

  • Powershellで外部テキストファイルより

    まだまだPowershellの初心者で勉強中です。よろしくお願いします。 下記のような記述がしてある『applist.txt』というテキストファイルがあります。 ホスト名  チーム名 abc123  ponpon666 12def456  gekogeko777 ghi78912  fufufu888 Powershellで、まず端末のホスト名を取得し、その値と、上記の『C:\share』というフォルダの中にあるテキストのホスト名と一致した行にある値を表示したいのです。 外部テキストは、他の作業でも使用するため編集はできません。 作ってみたものは、   $result = ipconfig /all $hostname = $result[6].split(":")[1].Trim()  Select-String $hostname -Path C:\share\applist.txt  として、  ホスト名がghi78912という名前のPCのPowershell ISEで実行したところ  C:\share\applist.txt:3:ghi78912 fufufu888 と1行分が出てしまいます。 これをチーム名のfufufu888だけが取得できるようにするには、どのようにすると良いのか、教えていただけませんでしょうか。

  • powershellの配列について

    すみませんが、powershellの配列について、困っていることがあります。 下記に教えていただければと思います。 【やりたいこと】 スペースがバラバラに入っているファイルの中身を配列に格納したい。 その際、スペースを省いて数字のみ配列に入れたい 【今の状態】 > $test4 = $(Get-Content -path "C:\a.txt") > echo $test4 1 2 3 4 5 6 7 89 > write-host $test4[0] 1 > write-host $test4[1] (スペースが認識されてしまう) > write-host $test4[2] 2 【望む結果】 $test4にファイルの中身を格納する。 その後、以下の結果にしたい。 > write-host $test4[0] 1 > write-host $test4[1] 2 > write-host $test4[7] 89

  • PowershellでExcelの値を取得したい

    PowershellでExcelの値を取得したい こんにちは。Powershellを勉強しています。 Excelを開いて、セルの値を読み取って、合計値を出力したいと思っています。 Excelファイルの A1に10 B1に50 が入力されています。 その上が下記のコードを書きました。 $path = "C:\\Book1.xlsx" $Excel = New-Object -ComObject Excel.Application $Excel.Visible = $TRUE $Book = $Excel.Workbooks.Open($path) $Sheet = $Book.Worksheets.Item("Sheet1") $CellValue1 += $Sheet.Cells.Item(1,1).Text #10が入っている $CellValue2 += $Sheet.Cells.Item(1,2).Text #50が入っている $Values = $CellValue1 + $CellValue2 Write-Host $Values $Book.Close() $Excel.Quit() 実行すると、なぜか CellValue1に「10101010」という値が入ってしまっています。 CellValue2に「5050」という値が入っています。 Write-Host $Valuesを行うと、101010105050 という値が出力されてしまいます。 出力したい結果は「60」なのですが、目的と違った値が出力されてしまうのは何故でしょうか?

  • PowerShellでファイル存在確認するとき

    PowerShellについて勉強中です。 現在、日付を取得したものをファイル名にしてログファイルを作成し、そこに、その日の実行したスクリプトの結果が追記されていくようにしたいのですが、新規にファイルを作成した時には、当然問題がないのですが、new-itemを使用したため、すでにフォルダがありますとエラーになってしまいます。 ログファイルを作成する部分と、スクリプト実行の部分を分けずに、ひとつのps1にしなければなりません。 そのため、if文などで分岐をする必要があると思うのですが、ログのファイル名が日付を取得するので、このような場合、どう記述するものなのか、教えていただければと思います。 日付を取得してファイルを作成したところまでを、下に書きます。 よろしくお願いします。 Function GetFileName([ref]$fileName) #日付を取得してログファイル名に設定する { $invalidChars = [io.path]::GetInvalidFileNamechars() $date = Get-Date -format yyyy/MM/dd $fileName.value = ($date.ToString() -replace "[$invalidChars]","-") + ".log" } $fileName = $null #ログファイルをc:\shareに作成する GetFileName([ref]$fileName) new-item -path c:\share -name $filename -itemtype file この下に、実行するバッチの起動などのスクリプトが続きます。

  • ファイル内でのini_set

    ファイル内でのini_setの挙動について意味がわかりません。 エラー表示を制御させたくphpファイル内にini_set('display_errors', 0);としました。 echo ini_get('display_errors');//1と表示 ini_set('display_errors', 0); //$str = "aaa" echo ini_get('display_errors');//0と表示 exit; この状態で$strのコメントを外すとなぜかエラーがきっちり表示されてしまいます。 調べたところファイル内で設定できないものもあるがこの項目についてはファイル内で 制御できるとありました。 .htaccessではinclude_pathの設定をしているだけでdisplay_errorsの設定はしておらず全く 原因がわかりません・・・ちなみに.htaccessでphp_value display_errors Offを入れると エラーは表示されません。 環境はphp5でxamppを利用しております。 ローカルか運用サーバーかでそれぞれの制御を変えたくできればphp内で行いたいのですが どうすればいいものでしょうか?

    • 締切済み
    • PHP