パスワードを忘れた? アカウント作成
13595553 journal
日記

delta-keeperの日記: PowerShell 6

日記 by delta-keeper

今日はiniファイル()をPowerShellで使いたいとのご要望があったので、早速作ってみたのだが・・・
連想配列を使って読み込んだ値を格納しようとしたところ、値の代入が上手くいかずに苦戦した。
配列如きに一体何時間使わせるんだか・・・

この議論は、delta-keeper (31927)によって テキ禁止として作成されたが、今となっては 新たにコメントを付けることはできません。
  • PowerShell (with C#) でINIファイルの読み書き [qiita.com]

    しかし、Powershell連想配列のどの辺りで苦戦したの?

    • String型を配列要素に追加する処理ですね。
      宣言した配列に挿入するとエラーになるため、各設定項目は1変数1項目にして切り抜けました。。。

      function read_ini($filename)
      {
          $lines = get-content $filename
          foreach($line in $lines){
              # コメントと空行を除外する
              if($line -match "^$|^\s*"){ continue }

              # =を区切り文字として行を分割
              $param = $line.split("=",2)

              # 連想配列に代入(ここでエラー)
              $SettingInfo.Add( $param[0], $param[1] )

          }
      }

      ちなみに参考にしたのは以下のサイト。
      http://capm-network.com/?tag=PowerShell%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF

      # エラーメッセージは忘れてしまいました
      親コメント
      •         # コメントと空行を除外する
                if($line -match "^$|^\s*"){ continue }

        ちょっとヘンですね。
        まず、コメントの内容と違い、空行は削除されますが、コメントは削除されません。
        通常、iniファイルのコメントは、「;」から行末までです。

        また、何かの書き間違いかと思いますが、これだと、すべての行が無視されてしまいますね。
        正規表現で「^\s*」は、どんな行にもマッチしてしまいますので。
        普通に書けば、

                # コメントを削除する
                $line = $line -replace '\s*;.*$',''
         
                # 空行および空白のみの行を無視
                if($line -match '^\s*$'){
                  continue
                }

        あたりですかね。

                # 連想配列に代入(ここでエラー)
                $SettingInfo.Add( $param[0], $param[1] )

        $SettingInfo = @{}みたいに初期化していないから?
        連想配列を初期化せずに使える言語の方が少数派の様な気がします。

        それはともかく、何故普通に

                $SettingInfo[$param[0]] = $param[1]

        と書かないのか疑問。

        あと、
        セクションやクオーテーションはサポートしないとしても、
        =」が含まれない行でエラーを出さなくていいのか、とか、
        =」前後や、行末の空白を無視しなくいいのか、とか、
        いろいろ気にはなります。

        親コメント
typodupeerror

日々是ハック也 -- あるハードコアバイナリアン

読み込み中...