データ移行スクリプトをPowerShellで作る。インポートは完了

公開:2011-06-05 15:26
更新:2020-02-15 04:36
カテゴリ:powershell,アプリ・ライブラリ・言語

ようやくできた。しかし適当なつくりである。



#記事間のセパレータ
$sep_post = "--------";
$sep = "-----";

#コンテンツの内容を加工する関数
function convert_content([ref]$c)
{
    $p = 0;
    $pres = @();
    ## Preタグの内部は加工されないように$pres配列に格納しておく
    while($m = Select-String -InputObject $c.value -Pattern "<pre>[\S\s]*?</pre>" )
    {
        #<pre>タグの内部を配列に格納
        $pres += $m.Matches[0];
        #代わりにridという属性をつけて<pre>タグを置き換える。 
        $c.value = $c.value.SubString(0,$m.Matches[0].Index) + "<pre rid=`"$p`"/>" +  $c.value.SubString($m.Matches[0].Index + $m.Matches[0].Length,$c.value.Length - $m.Matches[0].Index - $m.Matches[0].Length);
        $p++;
    }


    #改行を<br/>に置換する
    $c.value = $c.value -ireplace "`r`n" ,"<br/>`r`n";
    #連続した<br/>を1つにまとめる
    $c.value = $c.value -ireplace "<br/><br/>","<br/>";
    #連続した<br/>は<p>に変換するのはヤメた。
#    if($c.value -imatch "\<br\/\>`r`n\<br\/\>")
#    {
#       $c.value = $c.value -ireplace "\<br\/\>`r`n\<br\/\>","</p><p>";
#       $c.value = "<p>" + $c.value + "</p>";
#       #空の<p></p>を取る
#       $c.value = $c.value -ireplace "\<p\>\r\n\<\/p\>","";
#    }

    # 余分な<br/>を消す。
    $c.value = $c.value -ireplace "<br/>\r\n(</?p>)","`r`n`$1";
    $c.value = $c.value -ireplace "(</p>)(\r\n)?<br/>","`$1";
    $c.value = $c.value -ireplace "(</?[duo][tl]>)<br/>","`$1";
    $c.value = $c.value -ireplace "(</?t[hdr]>)<br/>","`$1";
    $c.value = $c.value -ireplace "(</?table>)<br/>","`$1";
    $c.value = $c.value -ireplace "(</li>)<br/>","`$1";
    $c.value = $c.value -ireplace "http://sfpg.up.seesaa.net/image/","https://www.sfpgmr.net/images/";
    $c.value = $c.value -ireplace "-thumbnail2","";
    $c.value = $c.value -ireplace "(\<pre[\S\s]*?/>)\<br\/\>","`$1"
    $c.value = $c.value -ireplace "(\<blockquote[\s\S]*?>)\<br\/\>","`$1"
    $c.value = $c.value -ireplace "(\</blockquote>)\<br\/\>","`$1"

    #<pre>の中身を元に戻す。
    for($i = 0; $i -lt $pres.Length;++$i)
    {
        $c.value = $c.value -ireplace ("<pre rid=`"" + $i + "`"/>"),($pres[$i] );
    }
}
$wdir = "c:\hoge\"
#出力ファイルを開く
$writer = New-Object IO.StreamWriter(($dir + "out.log"),$false,[Text.Encoding]::GetEncoding("utf-8"));

#ディレクトリ内にあるエキスポートファイルを列挙する
foreach($file in Get-ChildItem(($dir + "mtarchive*.log"))
{
    #エキスポートファイルを開く
    $reader = New-Object IO.StreamReader($file,[Text.Encoding]::GetEncoding("utf-8"));
    while(!$reader.EndOfStream){
    $line = $reader.ReadLine();
    if($reader.EndOfStream)
    {
        $reader.Close();
        break;
    }
    #投稿者
    $author = "";
    if($line -like "AUTHOR:*")
    {
     $author = ($line -ireplace "S.F.","sfpgmr");
    }
    #タイトル
    $title = $reader.ReadLine();
    #ステータス
    $status = $reader.ReadLine();
    #コメントを許可するか
    $allow_comments = $reader.ReadLine() -ireplace '\d', '1'
    #改行を変換するかどうか
    $convert_breaks = $reader.ReadLine();
    $convert_body = $convert_breaks -eq "CONVERT BREAKS: 1";
    #pingを許可するかどうか
    $allow_pings = $reader.ReadLine();
    #primary category
    $primary_category = $reader.ReadLine();
    #category
    $category = $reader.ReadLine();
    #日付
    $date = $reader.ReadLine();
    if($reader.ReadLine() -ne $sep){ exit;}
    #記事
    $body = $reader.ReadLine();
    $content = "";
    while(($line = $reader.ReadLine()) -ne $sep)
    {
        $content += $line + "`r`n";
    }
    #記事の続き
    $extended_body = $reader.ReadLine();
    $extended_content = "";
    while(($line = $reader.ReadLine()) -ne $sep)
    {
        $extended_content += $line + "`r`n";
    }
    #要約
    $excerpt = $reader.ReadLine();
    $excerpt_content = "";
    while(($line = $reader.ReadLine()) -ne $sep)
    {
        $excerpt_content += $line + "`r`n";
    }
    #キーワード
    $keyword = $reader.ReadLine();
    $keyword_content = "";
    while((!$reader.EndOfStream) -and (($line = $reader.ReadLine()) -ne $sep))
    {
        $keyword_content += $line + "`r`n";
    }
    #コメント
    $comment ="";
    while((!$reader.EndOfStream) -and ($line = $reader.ReadLine()) -ne $sep_post)
    {
        $comment += $line + "`r`n";
    }

    if($convert_body) {
        convert_content([ref]$content);
    }

    #出力する
    $writer.WriteLine($author);
    $writer.WriteLine($title);
    $writer.WriteLine($status);
    $writer.WriteLine($allow_comments);
    $writer.WriteLine($convert_breaks);
    # $write.WriteLine $convert_body);
    $writer.WriteLine($allow_pings);
    $writer.WriteLine($primary_category);
    $writer.WriteLine($category);
    $writer.WriteLine($date);
    $writer.WriteLine($sep);
    $writer.WriteLine($body);
    $writer.WriteLine(($content + $sep));
    $writer.WriteLine($extended_body);
    $writer.WriteLine(($extended_content + $sep));
    $writer.WriteLine($excerpt);
    $writer.WriteLine(($excerpt_content + $sep));
    $writer.WriteLine($keyword);
    $writer.WriteLine(($keyword_content + $sep));
    if($comment.Length -gt 0){
        $writer.Write(($comment));
    }
    $writer.WriteLine($sep_post);
    }
    $reader.Close();

}
$writer.Close();

このスクリプトで作ったファイルをインポートしてデータの移行はようやく完了した。