Powershell How to decompile chm file?

# 作成する方法
##完全に手動
[ヘルプファイル(.chm)の手動コンパイルについて](https://qiita.com/naninanya/items/d448fb091380f284d9dc)
##必要なもの
[HTML Help Workshop and Documentation ](https://www.microsoft.com/en-us/download/details.aspx?id=21138)
##Visual Studioを使う方法
[]()
[[SandCastle] C#のxmlコメントからヘルプファイル(.chm)を作成する 2020/04/020](https://qiita.com/tera1707/items/716debf53e8e5f2f4b1b)
##ダウンロード時は注意が必要

[Windows10において、表示されないHTML ヘルプ ファイル (.chm)がある事象について 2018/10/23 ](https://answers.microsoft.com/ja-jp/windows/forum/all/windows10%E3%81%AB%E3%81%8A%E3%81%84%E3%81%A6/db883904-88cc-4e5f-9f1b-0af420494e85）
[windows10でchmファイルの内容が見えない場合の対処法 2016/11](https://qiita.com/sttstcs/items/8ce113dfa992b57b4b26)
[Gaucheのオンラインヘルプをオフライン化した 2014/07/14](https://qiita.com/aki426/items/da8a405ab3f663182ba5)

#Technetを保存する理由
[突然消滅したMicrosoft TechNet／MSDNブログ（日本語）の捜索](https://www.atmarkit.co.jp/ait/articles/1906/04/news004.html)
マイクロソフトは平気でやります。そして復活していないものの一つを知っています。それは（16bit）PowsershellでMicrosoft Access の mdbファイルを変換できることに関する記事です。これは自分が書いたものでも参照されることが多いのですが、原因は元の記事が削除されているためです。
軽妙で面白い2010年までの Hey! Scripting Guy!も風前の灯火です。
https://gallery.technet.microsoft.com/scriptcenter/site/search?f%5B0%5D.Type=User&f%5B0%5D.Value=Hey%2C%20Scripting%20Guy
機械翻訳のように定数をpbm-2にすることも以下のような、アプリケーションの使用を中止するを強くお勧めします。おまは一昔前の外人さんみたいな訳をするんじゃない（いま絶対テレビでやらんだろうが）。でも、あれって差別でもなんでもなく片言どころか、プログラムのように日本語を理解しているとこうなるのかも。とにかくちゃんと訳しているのとは全然別物。
Hey, Scripting Guy! コンピュータにインストールされている ODBC ドライバの一覧を取得する方法はありますか
https://gallery.technet.microsoft.com/scriptcenter/c244573b-75bf-4106-9dca-aac19ff6d268
こうしたまさにかゆいところに手が届くような記事がみんな消えるのです。

もちろんこれではSYSWOWは取れないので、

```vb
Const HKEY_LOCAL_MACHINE = &H80000002 
strComputer = "." 
Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv") 
strKeyPath = "SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers" 
objRegistry.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, arrValueTypes 
For i = 0 to UBound(arrValueNames) 
    strValueName = arrValueNames(i) 
    objRegistry.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue     
    Wscript.Echo arrValueNames(i) & " -- " & strValue 
Next
```

たしかにScripting Guyの記事は古いです。64bitに対応していません。ここをみればインスピレーションが湧いてこんなコードも1時間程度でかけてしまうのです。プロならもっと早いでしょう。

```vb:ODBCList.vbs
' This code, you should Write in UTF-16LE ("UNICODE" of Notepad.exe)
' If you write this code with notepad.exe, and save ANSI file format, then notepad may change this file to utf-8.
' ODBC Driver List text file named "ODBCInstalledDriverList.txt (UTF-16LE)" will be saved at Folder which is in This vb Script.
Const HKEY_LOCAL_MACHINE = &H80000002 
Dim wsh, fs, strComputer, objRegistry, strKeyPath, arrValuenames,  arrValueNamesSysWOW64
Dim i, strValueName, TS, strPath, v
Const cnsListfFleName = "ODBCInstalledDriverList.txt" 
strComputer = "." 
Set WSH = WScript.CreateObject("WScript.Shell")
Set fs = CreateObject("Scripting.FileSystemObject")

strFileName = WSH.CurrentDirectory & "\" & cnsListfFleName
If fs.FileExists(strFileName) then fs.deletefile(strFileName)
set TS = fs.OpenTextFile(strFileName, 2 , true, -1)
Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv") 

If LCase(CreateObject("WScript.Shell").Environment("Process").Item("PROCESSOR_ARCHITECTURE"))="amd64" Then
TS.Write "Important Note:This is 64bit Wiondows. First Show System32 ODBC Drivers(64bit) And Next Show SYSWOW64 ODBC Drivers(32bit)" & vbCrlf  & vbCrlf  & vbCrlf
Else
TS.Write "***" & vbTab & "This is 32bit Windows. Show System32 ODBC Drivers(32bit)" & vbCrlf  & vbCrlf  & vbCrlf
End if

TS.Write "***" & vbTab & "System 32 ODBC Installed ODBC Drivers List" & vbTab & "***" & vbCrlf & vbCrlf

strKeyPath = "SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers" 
objRegistry.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, v
  
For i = 0 to UBound(arrValueNames) 
    strValueName = arrValueNames(i) 
    objRegistry.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue    
'    WScript.Echo arrValueNames(i) & " -- " & strValue
    TS.Write  arrValueNames(i) & " -- " & strValue & vbCrlf
Next
Set objRegistry = Nothing
' For 64bit Windows SysWOW64
If LCase(CreateObject("WScript.Shell").Environment("Process").Item("PROCESSOR_ARCHITECTURE"))="amd64" Then
' Once Reset ( avoid error)
TS.Write vbCrlf& vbCrlf & "***" & vbTab & "SOFTWARE\WOW6432Node\ODBC\ODBCINST.INI\ODBC Drivers" & vbTab & "***" & vbCrlf  & vbCrlf
Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv") 

strKeyPath = "SOFTWARE\WOW6432Node\ODBC\ODBCINST.INI\ODBC Drivers" 
objRegistry.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNamesSysWOW64, v
For i = 0 to UBound(arrValueNamesSysWOW64) 
    strValueName = arrValueNamesSysWOW64(i) 
    objRegistry.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue    
'    WScript.Echo arrValueNamesSysWOW64(i) & " -- " & strValue
    TS.Write  arrValueNamesSysWOW64(i) & " -- " & strValue & vbCrlf
Next
End If
TS.Close
Set TS = Nothing
Set fs = Nothing
Set WSH = Nothing
```

さらにマイクロソフトは鬼畜で、リダイレクトするどころかアクセスをブロックしています。最近そういうのが多いです。

#hlpファイルは機能が削除されているがchmファイルは使える
[Windows ベースのプログラムでヘルプを開こうとすると、「機能は含まれていません」または「ヘルプはサポートされていません」というエラーが表示される](https://support.microsoft.com/ja-jp/help/917607/feature-not-included-help-not-supported-error-opening-help-windows)
10 の Windows、Windows Server 2012 またはそれ以降のバージョンの Windows Server では、Windows ヘルプ プログラムはサポートされていません。Windows ヘルプ プログラムは、Windows Vista では、7、8 および 8.1 のみ利用できます。 ソフトウェア開発者が Windows ヘルプ アプリケーションの使用を中止するを強くお勧めします。.Hlp ファイルに依存するプログラムを出荷するソフトウェア開発者は、CHM、HTML、XML など、別のヘルプ ファイル形式に、ヘルプの操作性に移行することをお勧めします。詳細については、MSDN の記事を参照してくださいのどのバージョンのヘルプが必要ですか?マイクロソフトは、ヘルプの将来のテクノロジーを開発して、中には、ヘルプ作成者は、HTML ヘルプの 1.4 を使用し続けるお勧めします。1.4 の HTML ヘルプは、Windows 7 以降のバージョンの Windows に含まれます。
[HLP 形式ヘルプを CHM 形式のヘルプに変換](https://moondoldo.com/DoldoWorkz/index.php?Windows10%E7%94%A8WinHlp32.exe%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%83%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)

#Powershellでchmファイルを逆コンパイルする方法

2016/6/25初出のPrateekKumarSingh Social Technet
---

[How to decompile a Compiled HTML Help (.CHM) files and extract information using Powershell](https://social.technet.microsoft.com/wiki/contents/articles/34963.how-to-decompile-a-compiled-html-help-chm-files-and-extract-information-using-powershell.aspx)
>コンパイル済み HTML ヘルプ (.CHM)?
Microsoft コンパイル済み HTML ヘルプは、HTML ページ、インデックス、およびその他のナビゲーション ツールのコレクションから成る Microsoft 独自のオンライン ヘルプ形式です。ファイルは圧縮され、拡張子が付いたバイナリ形式で展開されます。CHM (コンパイル済み HTML の場合)。この形式は、Sysinternals ツールのように、ソフトウェア ドキュメントでよく使用されます。

>HTML ヘルプを逆コンパイルする方法
今日、私と私の友人は、.chmファイルをHTMLに逆コンパイルし、HTML DOMを解析して情報を抽出するアプローチを探していました。いくつかの調査の後、私はWindowsのコマンドラインユーティリティHH.exeがWindowsオペレーティングシステムに付属していることがわかりました.CHM ファイルを HTML に、いくつかのコマンド ライン オプションを使用します。

>だから私は以下のようなPowershell関数にコマンドを包みました

>```powershell
<#
 PURPOSE : Script utlizes HH.exe to decompile the Compiled HTML Help file (.CHM)
 AUTHOR : Prateek Singh
 BLOG : http:\\Geekeefy.wordpress.com
#>
Function Get-DecompiledHTMLHelp
{
    [cmdletbinding()]
    param(
            [String] $Destination, [String]$Filename
    )
    $EXE = 'C:\Windows\hh.exe'
    If(-not (Test-Path $destination))
    {
        "Destination folder doesn't exist"
    }
    elseIf(-not (Test-Path $Filename))
    {
        "Target .chm file not found, please make sure you're entering the full path and file name"
    }
    else
    {
        Start-Process -FilePath $EXE -ArgumentList "-decompile $Destination $Filename"
        $FilesAndFolder = Get-ChildItem $Destination -Recurse| group psiscontainer
        $FolderCount = ($Filesandfolder| ?{$_.name -eq $true}).count
        $FileCount = ($Filesandfolder| ?{$_.name -eq $False}).count
        Write-host "Decompiled into $(if($Foldercount -gt 0){$Foldercount}else{0}) Folders and $(if($FileCount){$FileCount}else{0}) Files to Destination $Destination" -ForegroundColor Yellow
    }
}
```

>コンパイル済み HTML ヘルプ ファイル (.CHM) と、次の図のように、コンテンツを逆コンパイルしてターゲットの宛先に保存する関数に、逆コンパイルされたコンテンツを配置する保存先フォルダー。

>HTML <Tags>を使用して HTML ファイルから情報を抽出する
HTML ファイルから情報を抽出するには、関数 Create-HTMLDomFromFile を使用して HTML コンテンツに対する DOM 構造を作成し、以下のような特定の HTML の下にあるテキストをプルします。

---

とソースではなここで終わっているがCreate-HTMLDomFromFIleはGithubにある
https://gist.github.com/PrateekKumarSingh/c44fbda1f0b6c34434f523e566c204ac
もうTechNetから削除されたのだろうか？
紹介されている筆者のWordPressのブログも2018年を最後に更新されていない。
もしこの世にいないのなら、テックネットが消えたら、こうした記事も更新されず消えてしまう。
サーバー代がかさむとか参照数が少ないとか、そら記事につながらないだけでしょう。
　そもそも、紙では市場ではペイしないマイナーな情報をコストが0で保存して閲覧できるのがインターネットなのでサーバー代が係るとか閲覧数が少ないとか寝言にしかすぎません。公式のヘルプはCMじゃないんだからどういうわけのわからないことを言っているんだ。コカインでもやっているのかというくらい馬鹿げている。これは独占企業の横暴です。マイクロソフトはさっさと考えを改めるか会社を解体するかどっちかを選んでください。こういうヘルプなんて削除してAzureで暴利を貪ろうなどという考えはさっさとやめましょう。でないとPCなんて誰も使わなくなりますよ。