kurukuru-papaのブログ

主に、ソフトウェア開発に関連したメモを書き溜めたいと思います。

Chromium版EdgeでIEモードを使う際の注意点

Chromium版EdgeのIEモードを使用して、IE専用のイントラのWebアプリケーションを表示していると、人によって、もしくは端末によって、表示や動きに違いがありました。あるWebアプリケーションのページを表示する際、ある人のEdgeではIE11で描画されるのに対して、私のEdgeではIE7として描画されました。調べてみると、人/端末によって、互換表示するIEバージョンが異なっているようです。この動作の差異について調べてみました。

前提

本記事は、Windows10/11において、Chromium版Edgeを使用していることを前提としています。

ポイント

Chromium版EdgeのIEモードにおいて、ページ描画時に使用するIEのバージョンには、Edgeの「IEモード」とIE11の「互換表示設定」が関連する。

Edgeの「IEモード」

Edgeの「IEモード」を有効にする方法はいくつかあります。

  • 一つは、Edgeのメニューから「設定など」>「Internet Explorerモードで再読み込みする」を実行する方法です。
  • 別の方法としては、Edgeのメニューから「設定など」>「設定」を開き、「既定のブラウザー」で、「Internet Explorer の互換性」に設定を行う方法があります。
  • また、エンタープライズサイトリストマネージャーで、対象サイトを登録する方法もあります。

Edgeの「IEモード」を有効にすると、ページの描画には、IE11のエンジンが使われます。IE11のエンジンでは、基本的にはIE11として動作しますが、IE11の「互換表示設定」が有効な場合は、IEの11~5を自動判定して動作することがあります。

エンタープライズサイトリストマネージャーでは、「互換モード」として、「既定のモード」やIE11~5を選択できます。

ちなみに、IEモードで開発者ツールを使うには、IEChooser.exeを使うことができます。実行パスはC:\Windows\System32\F12\IEChooser.exeです。

IE11の「互換表示設定」

IE11の「互換表示設定」が有効な場合、IEの設定やWebページの内容によって、IE11, IE7, IE5あたりを自動判定して動作することがあります。ただし、詳細な条件は煩雑そうで詳しくは調べていないです。

IE11の「互換表示設定」を参照/変更するためには、IEを起動する必要がありますが、私の環境ではスタートメニューなどにIEが表示されませんでした。その場合は、コマンドプロンプトや「ファイル名を指定して実行」から次のコマンドを実行することで、IEを起動して設定することができます。この起動方法は、下記参考サイトに載っていました。

rem IEを起動するコマンド
rem 「bing」部分は変更可能だが、何かしら記述する必要がある。
iexplore bing -embedding

上記では上手くIE起動できないこともありました。その場合は、PowerShellで次のコマンドを実行してIE起動できました。

$objIE = new-object -com InternetExplorer.Application
$objIE.visible=$true

以上のように、Edgeの「IEモード」とIE11の「互換表示設定」は、ページの描画に大きな影響を与えることが分かりました。正しく設定することで、Webアプリケーションをスムーズに表示することができます。しかし、設定が間違っている場合は、表示や動作に不具合が生じる可能性があります。

参考サイト

エクスプローラーが散らかってしまう? PowerShellで整理できました!

私がWindows環境で作業をしていると、いつの間にか色々なアプリケーションのウインドウが表示されています。 目的のウインドウに切り替えようとすると、ウインドウをかきわけるのに、何度もマウス操作しなければなりません。タスクバーの操作でも、何回かクリックが必要です。 特に、10個ぐらい開いてしまっているエクスプローラーの操作が大変です。

そこで、PowerShellを使って、これらのエクスプローラーをきれいに並べることで、扱いやすくしてみました。

ポイント

  1. $shell=New-Object -ComObject Shell.Application; $shell.Windows()エクスプローラーの情報を取得できました。
  2. $shell.Windows() | foreach { $_.Left=0; $_.Top=0; $_.Width=800; $_.Height=600; }エクスプローラーの位置とサイズを変更できました。
  3. [System.Windows.Forms.Screen]::PrimaryScreen[System.Windows.Forms.Screen]::AllScreens で画面サイズを取得できました。

結果イメージ

次のように、エクスプローラーを並べてみました。

コメント 2020-07-26 203203_2.png

スクリプト

画面の左上から右下へ、少しずらしながら重ねて並べる。 なお、重ねる順番は、表示しているパス順にしました。

$w = 800
$h = 600
$x = 0
$y = 0
$dx = 30
$dy = 30
$shell = New-Object -ComObject Shell.Application
$shell.Windows() | where { $_.Name -eq "エクスプローラー" } | sort LocationURL | foreach {
  $_.Left=$x; $_.Top=$y; $_.Width=$w; $_.Height=$h; $x+=$dx; $y+=$dy;
}

同様に、画面右下を基準に並べる。

Add-Type -AssemblyName System.Windows.Forms
$sw = [System.Windows.Forms.Screen]::PrimaryScreen.WorkingArea.Width
$sh = [System.Windows.Forms.Screen]::PrimaryScreen.WorkingArea.Height
$w = 800
$h = 600
$x = $sw - $w
$y = $sh - $h
$dx = -30
$dy = -30
$shell = New-Object -ComObject Shell.Application
$shell.Windows() | where { $_.Name -eq "エクスプローラー" } | sort LocationURL | foreach {
  $_.Left=$x; $_.Top=$y; $_.Width=$w; $_.Height=$h; $x+=$dx; $y+=$dy;
}

動作確認環境

参考にさせていただいたサイト

ロックしないでファイル読み込み

少し特殊ですが、ファイルをロックしないで読み込みしたくなりました。PowerShellで実装してみましたので、メモしておきます。

実装方法

ファイルをロックせずに、ファイル内容を標準出力します。ポイントは、ファイルオープン時に指定するFileShareのReadWrite、Deleteです。

$inpath = 'D:\tmp\dummy.txt'
$sr = [System.IO.StreamReader]::new(
    [System.IO.FileStream]::new(
        $inpath,
        [System.IO.FileMode]::Open,
        [System.IO.FileAccess]::Read,
        # 他プログラムの読み書き、削除をロックしない
        [System.IO.FileShare]::ReadWrite + [System.IO.FileShare]::Delete))
echo $sr.ReadToEnd()
$sr.Close()

ファイルオープン部分は、次のように書くこともできますね。

$fs = [System.IO.File]::Open(
    $inpath,
    [System.IO.FileMode]::Open,
    [System.IO.FileAccess]::Read,
    [System.IO.FileShare]::ReadWrite + [System.IO.FileShare]::Delete)
$sr = [System.IO.StreamReader]::new($fs)

テキスト読み込み部分は、次のようにして、1行ごとに処理することもできますね。

while (($line = $sr.ReadLine()) -ne $null) {
    echo $line
}

ワンライナー

Windowsコマンドプロンプトから、ワンライナーで実行する場合は、次のように書けました。

powershell -Command "$sr = [System.IO.StreamReader]::new([System.IO.FileStream]::new('D:\tmp\dummy.txt', [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::ReadWrite + [System.IO.FileShare]::Delete)); echo $sr.ReadToEnd(); $sr.Close()"

動作確認方法

上述のファイル読み込み中に、ロックがかかっていないことを動作確認するときは、読み込み処理の途中で、Start-Sleep 10(10秒のスリープ)などを入れると便利です。当プログラムを実行して、スリープ中に、他のプログラムから読み書き、削除ができることを確認できるはずです。なお、他のプログラムがファイル削除した場合、削除処理成功しますが、ファイルはまだ残っていて、当プログラムがファイルクローズ後に、ファイルが削除されました。

動作確認環境

参考

Windows標準機能だけで文字列置換できた!

まったく予期していなかったのですが、Windows標準機能だけで、テキストファイルの文字列置換を行えるのですね。びっくりです。

次の2つのサイトが非常に参考になりました。

knowledge.reontosanta.com
blogs.yahoo.co.jp

私が書いたWindowsバッチファイル(StringConverter.bat)は、次のようになりました。

@echo off
set basedir=%~dp0
set basename=%~n0
set batname=%~n0%~x0
set datestr=%DATE:/=%
set timestrtmp=%TIME: =0%
set timestr=%timestrtmp:~0,2%%timestrtmp:~3,2%%timestrtmp:~6,2%
set timestamp=%datestr%-%timestr%

:INIT
if "%1"=="/?" (
  echo 使い方:%batname% 入力ファイル 出力ファイル 置換前文字列 置換後文字列
  exit /b 0
)
if "%4"=="" (
  echo 引数の数が不正です。
  goto ERROR
)
set inpath=%1
set outpath=%2
set before=%3
set after=%4

:MAIN
call :LOG 処理開始します。


type nul > %outpath%
setlocal enabledelayedexpansion
for /f "tokens=1* delims=: eol=" %%a in ('findstr /n "^" %inpath%') do (
  set line=%%b
  if not "!line!" == "" (
    set line=!line:%before%=%after%!
  )
  echo.!line!>> %outpath%
)
endlocal


:END
call :LOG 正常終了です。
exit /b 0

:ERROR
call :LOG 異常終了です。
exit /b 1

:LOG
echo %DATE% %TIME% %basename% %1
exit /b 0

:EOF

このWindowsバッチファイルは、次のように実行します。

StringConverter.bat 入力ファイル 出力ファイル 置換前文字列 置換後文字列

入力ファイルのサンプルです。

サンプルデータです。
ShiftJIS、CRLFで記述されています。

空白区切り:カラム1 カラム2 カラム3
カンマ区切り:カラム1,カラム2,カラム3
タブ区切り:カラム1 カラム2 カラム3

;セミコロンで始まる行

バッチ実行後の出力ファイルは、次のようになりました。

サンプルデータです。
ShiftJIS、CRLFで記述されています。

空白区切り:column1 column2 column3
カンマ区切り:column1,column2,column3
タブ区切り:column1 column2 column3

;セミコロンで始まる行

PowerShellからODBC接続してSQL実行してみました

Windows環境で、SQLクライアントソフトを使って、定型的なSQL文を実行することがあり、手間に感じていました。Windows環境で、コマンドラインから、手軽にSQL実行することができることを知りましたので、試してみました。

ポイントは、PowerShellから、.NET FrameworkODBCライブラリを使用することにあります。

続きを読む

ODBCのデータソースをコマンドラインから作成してみました

複数のWindows端末で、同じODBC設定を、GUIから行うのを、少々手間に感じていましたが、コマンドラインから実行する方法を知りましたので、試してみました。

続きを読む

H2データベースにODBC接続してみました

ちょっと、Windows環境でODBC接続してSQLを実行したくなりました。

手元にあるPCを確認すると、データベースがインストールされていませんでしたので、手軽にインストールできて、ODBC接続ができるH2データベースを使用して、ODBC接続するまでに行った手順をメモしておきます。

続きを読む