VisualStudioCodeであるフォルダ以下のファイルを全てShift-JISで開きたい

やりたいこと

タイトルの通りなんだが、 Shift-JISで書かれた文書がフォルダ以下にたくさんあって、その内容を Visual Studio Code で確認したい。

Visual Studio Code のデフォルトエンコードUTF-8 なので、まぁ文字化けするわするわ。

試したこと1

  1. ステータスバーの右下の UTF-8 をクリック
  2. エンコード付きで再度開く
  3. Japanese(Shift-JIS)を選択

こんなんファイル開くたびにやってられない。。

試したこと2

  1. ファイル -> 基本設定 -> 設定
  2. ユーザー設定を選択
  3. ""files.encoding": "shiftjis"" を追加

これだと毎回 Shift-JIS になってしまう。

いつもは UTF-8 で見たいんだよぉぅ。。

試したこと3(解決方法)

Visual Studio Code は ワークスペースって概念があって、そのワークスペース毎に設定を記述できる。 (概念って書いてるけど、単にフォルダ毎に設定書けるってはなし)

方法2で、ユーザー設定を選択してたけど、その横にワークスペースの設定がある。 これを選択することで、ワークスペース.vscode\settings.json ってファイルができるので、この中に設定を記述していく。

で、この設定はワークスペース内に適用される。

ワークスペースの設定に "files.encoding": "shiftjis" を記述することで、 ワークスペース以下(フォルダ以下)のファイルが Shift-JIS で開くことができる。

ちなみに、ワークスペースの設定は、ユーザー設定よりも優先されるらしいので、一番強い設定になるのかな。

https://vscode-doc-jp.github.io/docs/getstarted/settings.html

その他

qiita.com

こちらの記事を最初読んでて、"files.autoGuessEncoding": true を設定して、自動エンコーディングを設定してたけど、思うようなエンコーディングにならない場合もあった。

公式にも

https://code.visualstudio.com/updates/v1_11#_auto-guess-encoding-of-files

Note: there are cases where the encoding is detected wrongly or not at all. To have full control over the encoding in the workspace, use the files.encoding setting instead.

注:エンコーディングが誤って検出されるか、まったく検出されない場合があるよ。ワークスペースのエンコーディングを完全に制御するには、代わりにfiles.encoding設定を使用してくれ。

とあり、自分の場合はShift-JIS 固定にしたかったこともあったので、files.encoding を設定した。

cshtml ファイルで Web.config の値を取得する

環境によって、cshtml のリンク先を変更したい。 下記みたいな感じ。

本番環境

<a href="https://honban.net/">リンク</a>

ステージング環境

<a href="https://staging.net/">リンク</a>

cshtml なので普通にC#のコードを記述することで取得できる。

<a href="@System.Configuration.ConfigurationManager.AppSettings["UrlKey"]">リンク</a>

Web.config の設定

<appSettings>
  <add key="UrlKey" value="https://honban.net/"/>
</appSettings>

参考

stackoverflow.com

WScript.CreateObject: "MSScriptControl.ScriptControl" というオブジェクトを作成できませんでした。とエラーが出たとき

環境

Windwos10 64bit

起こっていること

cmd ファイルから JScript を起動する処理があって、JScript の中でユーザー入力をさせるため、下記のコードのように MSScriptControl.ScriptControl を使用していた。

http://www.recfor.net/blog/diary/index.php?itemid=630

var obj=WScript.CreateObject("MSScriptControl.ScriptControl");
obj.language="vbscript";
obj.addcode("function getInput() getInput = inputbox(\"Message box prompt\",\"MessageBoxTitle\") end function");
var i=obj.eval("getInput");
WScript.Echo(i);

ただ、Windows10 64bit の環境で動かすと、

WScript.CreateObject: "MSScriptControl.ScriptControl" というオブジェクトを作成できませんでした。

というエラーメッセージが表示されてしまう。

インターネットでメッセージを調べれば色々な記事が出てくるんだけど、 64bit 環境では ScriptControl が提供されていないためエラーになっている様子。

ユーザー入力したいだけだし他の何かを使おうと調べても、JScript では提供されていないみたいで、代替案が無い。 調べても MSScriptControl.ScriptControl を使った方法ばかりヒットする。

解決方法

解決方法を探していて見つけた回答(マインクラフトのフォーラムにたどり着いてた)

http://forum.minecraftuser.jp/viewtopic.php?f=36&t=17205&start=80#p230261

仮にこれが原因の場合には
実行時に64bitOSかつsystem32配下で動いている場合には(64bit版で動いている場合には)
SysWOW64配下で実行し直す(32bit版で再実行する)
という回避策があるようです。

64bit でダメなんだから、32bit で動かせばいいよってことか。 (元々は Windows7 32bit で動作していた)

https://mo.kerosoft.com/0153

このページを参考にして、cmd ファイルの先頭に下記のコードを記述して、64bit の場合は、32bit 環境のコマンドプロンプトで起動し直すようにする。

if "%PROCESSOR_ARCHITECTURE%" NEQ "x86" (
    C:\Windows\SysWOW64\cmd /C %0
    exit
)

これで、今まで通り 32bit 環境で動作するようになり、MSScriptControl.ScriptControl も使えるようになる。

csprojにTarget属性を複数定義すると再定義になる

やりたかったこと

コンパイル後の処理をある条件で分岐したい

試してみたこと

<Target Name="AfterCompile" Condition="A">
</Target>
<Target Name="AfterCompile" Condition="B">
</Target>

こうしたときに条件Aのときにコンパイル後の処理が全然実行されない。

原因

公式のドキュメントにあるように、Target属性は複数定義した場合、再定義されている。

https://msdn.microsoft.com/ja-JP/library/ms171462.aspx?f=255&MSPPError=-2147217396

解決方法

下記を参考にした。

https://stackoverflow.com/questions/8709946/order-of-afterbuild-tasks-in-visual-studio-projects

<Target Name="AfterCompile">
    <CallTarget Condition="A" Targets="Aのときにする処理" />
    <CallTarget Condition="B" Targets="Bのときにする処理" /> Targets="OverwriteAppConfigByBuildTarget" />
</Target>

<Target Name="Aのときにする処理">
    処理
</Target>

<Target Name="Bのときにする処理">
    処理
</Target>

AfterCompile の Target の中で条件分岐して、新しく Target を作成した。