PowershellでAccess用のschema.iniを書き出すときはFilesystemobjectfでASCII形式でないとバグるらしい

#何度も書くけど、Access用のschema.iniの解説はこちらから御覧ください
まあまず何度も書いていますが、うっかりschema.iniで検索するとSQLサーバーのschema.iniに飛ばされます。
しかし、そこで書いてあることは特に文字コードが違うので参考にしてはいけません。
https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/initializing-the-text-data-source-driver
現在のAccessについては上記のリンクが正しいです。
ところがこの表題が「テキストデータソースドライバーの初期化」という全く意味がわからないタイトルとなっており、schema.iniが見つからないのです。
公式よりよりわかりやすい渡辺氏の記事でも「テキストデータソースドライバーの初期化」という単語が使われています。
  テキスト データ ソース ドライバと HTML データ ソース ドライバの初期化
  http://makoto-watanabe.main.jp/access/dahowchangingtext.htm
しかし、ACCESS用のschema.iniです
##間違ったリンク
Schema.ini ファイル (テキスト ファイル ドライバー)
https://docs.microsoft.com/ja-jp/sql/odbc/microsoft/schema-ini-file-text-file-driver?view=sql-server-ver15
urlを見てください。上記はoffice clientという文字があります。下にはありません。さらにsql sereverの文字があります。
なにが違うのかというと、選択できる文字コードがANSIとQEMとなっている点です。
AccessでCSVを読み込んだり書き込んだりする場合UTF-8は65001と指定できます。通常のShift-jisは932です。
### Charsetについて記述している部分を比較
####本物
[テキストデータソースドライバーの初期化](https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/initializing-the-text-data-source-driver)
>OEM、ANSI、UNICODE、または有効なコード ページの 10 進数の番号を設定できます。ソース ファイルの文字セットを示します。

####なりすまし
[Schema.ini ファイル (テキスト ファイル ドライバー)](https://docs.microsoft.com/ja-jp/sql/odbc/microsoft/schema-ini-file-text-file-driver?view=sql-server-ver15)
>ANSI と OEM の2つの文字セットから選択できます。 Schema.ini の CharacterSet 設定は、Windows レジストリの設定 (ファイル別) を上書きします。 次の例は、文字セットを ANSI に設定する Schema.ini エントリを示しています。


まあ普通はSQLサーバーを使っているんでしょうけど、自分はAccessしか使わないので。SQLサーバーはなりすまし扱いになります。

#公式に書いていない重要なこと。Schema.iniの文字コードはANSIであること
Schema.ini自体はANSI形式テキストファイルです。
これがかなり厳密で、Shift-jisですらダメでした。

https://excel-ubara.com/excelvba5/EXCEL118.html
>このテキストファイル(schema.ini)を読み込むTSVファイルと同一フォルダに置いておくだけになります。
>このテキストファイルの文字コードは「ANSI」で作成してください。
>Windows10のメモ帳の既定がUTF-8に変わっているのご注意してください。

#PowershellはAnsi形式では書き出せない？
Powershellはcmd.exeと同様clipでテキストファイルが取り出せます。
しかしこのときShit-jisを指定できますが、ANSIは指定できません。
SteamWriterも同様です。
そこで今の所filesystemobjectを使っています。
C:\Windows\assembly
にはないので、Usingとかはないようです。

##OpenTextfileではなくCreateTextfile
しかも今ヘルプを見て気がついたんですけど、
FSOのOpentextfileとCreatetextfileはとても似ています。
しかしこの場合はCreateTextFileを使います。
なぜかというとOpenTexFileはASCIIであって、ANSIではありません。
ところが、CreateTextFileはANSIです。(falseのとき）
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/createtextfile-method
CreateTextFile(ファイル名、[上書き]、[ unicode ]])
unicode  省略可能。 Unicode ファイルを作成するか、ASCII ファイルを作成するかを示す Boolean 値です。 Unicode ファイルとして作成する場合は True 、ASCII ファイルとして作成する場合は False です。 省略した場合は、ASCII ファイルとみなされます。
つまり、`$false`を使うべきです。

##蛇足ヒア文字は=@"とくっつけること
これ最初 `$strSchema = @"`としていたらエラーになりました
`$strSchema =@"` イコールとくっつけるといいようです。
Schemaのテキスト名を変数にすることを考えてダブルクォーテーションにしました。
変数を入れず展開しないならシングルクォーテーションです。

##`$PATH = Split-Path $MyInvocation.MyCommand.Path -Parent`
Powershell_ise内では効かないらしいですね。
しかし、一度バグらせるとデバッガーで動くのかな。
[PowerShell 関数内で$myInvocationがおかしい](http://programingx.blog.fc2.com/blog-entry-46.html)
[PowerShell 実行パスが取得できない ](https://www.remember-the-time.xyz/2019/02/powershell-myInvocation-mycommand-path.html)

```powershell
$vbTab = "`t" ; $vbCrLf = "`r`n" ; $Beep = "`a" ; $vbCr = "`r" ; $vbLF = "`f" ;  $vbNullString = "`0"
$OutputEncoding = [System.Text.Encoding]::GetEncoding("shift_jis" ) #https://qiita.com/EmEpsilon/items/7e8f72b9c58576b4c5a5
#Powershell_iseの中ではこれが効かない
$PATH = Split-Path $script:$MyInvocation.MyCommand.Path -Parent
#そこでエラーに持ち込んでデバッガーで移動させる
if($path -eq ""){
   try{ $path = $pwd}
     catch{
         if($error.Count -lt 0){
                               #$script:$MyInvocation.MyCommand.Path -Parent
                               $script:
                              }
          }
    }
Sl $PATH
#FilesystemObjectの変数 使わないけど予備
$ForWriteing = 2 ; $ForAppending = 8 ; $ForReading = 1
$fsoUnicode = -1 ; $fsoansiascii = 0
$fsoWinfolder = 0 ; $fsoSysFolder= 1 ; $fsoTmpFolder= 2
$fso = New-Object -ComObject "Scripting.FilesystemObject"
$schemafile = Join-Path $path 'Schema1.ini'
if($fso.FileExists($schemafile)){ $fso.DeleteFile($schemafile)}
$ts = $fso.CreateTextFile($schemafile ,  $true , $false)

$strSchma=@"
[jexSchemaTab.txt]
;text tab区切り headerあり, Exporを企図,UTF-8BOMなし
ColNameHeader=True
Format=TabDelimited
MaxScanRows=25
CharacterSet=65001
Col1="名前" Char Width 255
Col2="日付" Date
Col3="整数" Float
Col4="通貨" Currency
Col5="ほんと" Bit
TextDelimiter="
"@
$ts.WriteLine( $strSchma )
$ts.close() #Close
[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($FSO) #変数の解放
Remove-variable fso #変数の破棄
echo 'end'
```