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を使って、これらのエクスプローラーをきれいに並べることで、扱いやすくしてみました。
ポイント
$shell=New-Object -ComObject Shell.Application; $shell.Windows()
でエクスプローラーの情報を取得できました。$shell.Windows() | foreach { $_.Left=0; $_.Top=0; $_.Width=800; $_.Height=600; }
でエクスプローラーの位置とサイズを変更できました。[System.Windows.Forms.Screen]::PrimaryScreen
や[System.Windows.Forms.Screen]::AllScreens
で画面サイズを取得できました。
結果イメージ
次のように、エクスプローラーを並べてみました。
スクリプト
画面の左上から右下へ、少しずらしながら重ねて並べる。 なお、重ねる順番は、表示しているパス順にしました。
$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; }
動作確認環境
- Windows 10
- PowerShell 5.1
参考にさせていただいたサイト
ロックしないでファイル読み込み
少し特殊ですが、ファイルをロックしないで読み込みしたくなりました。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秒のスリープ)などを入れると便利です。当プログラムを実行して、スリープ中に、他のプログラムから読み書き、削除ができることを確認できるはずです。なお、他のプログラムがファイル削除した場合、削除処理成功しますが、ファイルはまだ残っていて、当プログラムがファイルクローズ後に、ファイルが削除されました。
動作確認環境
- Windows10
- Powershell 5.1
参考
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 FrameworkのODBCライブラリを使用することにあります。
続きを読む