none
Powershellのcontains演算子について RRS feed

  • 質問

  • Powershellのcontains演算子について質問です。
    よろしくお願いします。

    file.txtファイル内のテキスト文字列(改行含む)に「特定の文字」を
    含むかどうか検索するスクリプトを作成しています。
    「特定の文字」は、check.txtファイルに一文字のみ入力します。

    この「特定の文字」がある一部の文字の場合、意図したとおりに
    検索ができません。どなたかお分かりになる方はいらっしゃいますか。

    ○スクリプト
    $mapping_file = Get-Content -Encoding Default 'check.txt'
    $text = Get-Content -Encoding Default 'file.txt'
    $text -contains $mapping_file

    ○出力結果
    True または False

    ○問題
    check.txtの内部記載された一文字が以下の場合、
    file.txtに該当の文字が含まれるにもかかわらず、結果が
    Falseになってしまいます。
    ・「はしご高」 高 の変則文字
    ・「かっこ株」 (株)の一文字

    ○補足情報
    ・file.txt、check.txtはどちらもshift-jis(cp932)で保存しています。
    ・OSはWindows 7 SP1(32bit) Powershellのバージョンは下記の通りです。
    $PSVersionTable

    Name Value 
    ---- ----- 
    PSVersion 3.0 
    WSManStackVersion 3.0 
    SerializationVersion 1.1.0.1 
    CLRVersion 4.0.30319.18052 
    BuildVersion 6.2.9200.16481 
    PSCompatibleVersions {1.0, 2.0, 3.0} 
    PSRemotingProtocolVersion 2.2 
    2013年10月9日 13:53

回答

  • -contains演算子は対象文字列にある文字列が存在するかどうかを判定するものではなく、配列に要素が存在するかを判定する演算子ですが、そこは大丈夫ですか?

    つまり、このスクリプトが意図通り動作するのは、file.txtが一行一文字で構成されているときのみです。

    この条件下であれば、当方環境ではShift-JISで保存されたはしご高もかっこ株も正しく判定できました。

    • 回答としてマーク damsoya 2013年10月14日 9:22
    2013年10月10日 2:41
    モデレータ

すべての返信

  • 例えばはしご高はJIS X 0208、JIS X 0213:2004いずれにも存在しない文字ですが、どのようにエンコードしたのでしょうか? 具体的なバイト列を挙げた方が解決に結びつくと思います。

    Unicodeには存在するのでUTF-8などで保存すれば確実かと。またメモ帳 on Windows 8.1でANSIで保存したところIBM拡張文字 FBh FCh で保存されました。

    • 回答としてマーク damsoya 2013年10月14日 9:21
    • 回答としてマークされていない damsoya 2013年10月14日 9:22
    2013年10月10日 0:31
  • -contains演算子は対象文字列にある文字列が存在するかどうかを判定するものではなく、配列に要素が存在するかを判定する演算子ですが、そこは大丈夫ですか?

    つまり、このスクリプトが意図通り動作するのは、file.txtが一行一文字で構成されているときのみです。

    この条件下であれば、当方環境ではShift-JISで保存されたはしご高もかっこ株も正しく判定できました。

    • 回答としてマーク damsoya 2013年10月14日 9:22
    2013年10月10日 2:41
    モデレータ
  • 回答ありがとうございます。また変身が遅くなり申し訳ございません。

    ご指摘の通り、file.txtは一行複数文字で構成されています。
    そのため、一行一文字に変更したところ、問題無く動作いたしました。

    以前、以下のようなスクリプトで「ファイル内に含まれる文字を置換する」という-replace構文を
    以前に作成しており、意図した通りに動作しました。

    そのため、-containsも似たような動作をすると勘違いしておりました。

    $mapping_file = Get-Content -Encoding Default 'check.txt'
    $text = Get-Content -Encoding Default 'file.txt'
    $text -replace $mapping_file,"置換後文字"
    仕様を改めて確認してみます。ご指摘ありがとうございました。

    2013年10月14日 9:18
  • 回答ありがとうございます。

    根本的な原因は串田口大介様ご指摘の点でした。

    文字コードについては私もメモ帳 On Windows 7で実施しており、コードも同様でした。

    2013年10月14日 9:20
  • この文字の時だけ1行1文字じゃなかったということでしょうか?
    2013年10月14日 9:54