読者です 読者をやめる 読者になる 読者になる

ちんとんがめ♪色々備忘録・・・

なんか、メモ的な感じで使えればいいなみたいな。。。前検索したけど、忘れて同じもの検索するのって面倒だよね?・・・でも、結局検索するみたいな。。。

JavaScriptを使って、exeファイルを実行してみる。

基本的に第1引数にパスを入れれば実行できる(第2、3引数は省略可能)っぽい。
第2引数は、非表示にして、裏で動かしたいときに「0」を入れる感じ。
0~10までらしいけど、自分的には、使っても「2(最小化)」「3(最大化)」くらいかも?
まぁ、詳しくは下にあるリンク参照ってことで(笑)
第3引数は、true入れておけば、exeとかの実行が完了するまで、
JavaScriptがその先の実行を待ってくれるらしいので、、、やっぱ、使うよね。。。


例1)画面にメモ帳を表示する
function test()
{
var shell = new ActiveXObject("WScript.Shell");
shell.Run("C:\\Windows\\System32\\notepad.exe", 1, true);
}

例2)なんか後ろで自作のexeファイルを実行する
function test()
{
var shell = new ActiveXObject("WScript.Shell");
shell.Run("C:\\test\\test.exe", 0, true);
}

例3)exeファイルに引数を持たせる
function test(str)
{
var shell = new ActiveXObject("WScript.Shell");
shell.Run("C:\\test\\test.exe " + str, 0, true);
}

↓詳しくはここ
Run メソッド

PowerShellで空行削除を途中で入れようとしたら、Encodelingは最後に行わないと文字化けした。。。。

理由は分からないけど、文字列置換だけなら大丈夫だったけど、空行削除してエンコード保存するとエラーになったから、
とりあえずそのまま保存して、最後にエンコードしたら、文字化けしなかった。


$test = (Get-Content C:\テスト\テスト.txt)
【文字化けするコード】
# 文字列置換
$file_contents = $test -replace [regex]::Escape("\\test\test1\"), "\\test2\test2\"
$file_contents | Set-Content ".\テスト_enc.txt" -Encoding String

# 空行の削除
$file_contents = Select-String -Pattern "\S" ".\テスト_enc.txt" | %{$_.line}
$file_contents | Set-Content ".\テスト_enc.txt" -Encoding String

echo (Get-Content ".\テスト_enc.txt")

【文字化けしないコード】
# 文字列置換
$file_contents = $test -replace [regex]::Escape("\\test\test1\"), "\\test2\test2\"
$file_contents > ".\テスト_enc.txt"

# 空行の削除
$file_contents = Select-String -Pattern "\S" ".\テスト_enc.txt" | %{$_.line}
$file_contents > ".\テスト_enc.txt"

$file_contents | Set-Content ".\テスト_enc.txt" -Encoding String

echo (Get-Content ".\テスト_enc.txt")

【実行結果】
・文字化けするコードの場合
?e?X?g?@
\\test2\test2\test.txt

・文字化けしないコードの場合
テスト①
\\test2\test2\test.txt



――【もともとのファイルの中身】―――テスト.txt
テスト①



\\test\test1\test.txt
―――――――――――――――――――テスト.txt

PowerShellのエスケープのメモ

基本的に、エスケープといえば「`(バッククォート,逆アポストロフィ)」を使うけど、
文字列の置換するとき[regex]::Escape("文字列")を使ってる。

「`(バッククォート,逆アポストロフィ)」は改行「`n」やタブ「`t」を入れるときに使うが、
文字列の置換するときは、[regex]::Escape("文字列")メソッドのほうがよさそう。
アドレスを一括置換したいときとか。。。

例)
$test = (Get-Content C:\テスト\テスト.txt)
$test = $test -replace [regex]::Escape("\\test\test1\"), "\\test2\test2\"
$test > ".\テスト2.txt"



↓エスケープシーケンスについては、ここに詳しく書いてある
GUIユーザーのためのPowerShell入門 (14) PowerShellの文字列リテラル | マイナビニュース

PowerShellでそれぞれのEncodingオプションを実行してみた。

んで、nkfツール使って、ファイルの文字コードが何になっているか実行してみた。
う~ん・・・そうなんだ?
どこの環境でも同じなのかな・・・?

例)テスト.ps1
$test = (Get-Content C:\テスト\テスト.txt)
$test2 = (Get-Content C:\テスト\テスト.txt -Encoding Byte)
$test3 = (Get-Content C:\テスト\テスト2.txt)
$test4 = (Get-Content C:\テスト\テスト2.txt -Encoding Byte)
$test | Set-Content C:\テスト\テスト_Ascii.txt -Encoding Ascii
$test | Set-Content C:\テスト\テスト_BigEndianUnicode.txt -Encoding BigEndianUnicode
$test2 | Set-Content C:\テスト\テスト_Byte.txt -Encoding Byte
$test4 | Set-Content C:\テスト\テスト_Byte2.txt -Encoding Byte
$test | Set-Content C:\テスト\テスト_Default.txt -Encoding Default
$test3 | Set-Content C:\テスト\テスト_Default2.txt -Encoding Default
$test | Set-Content C:\テスト\テスト_Oem.txt -Encoding Oem
$test3 | Set-Content C:\テスト\テスト_Oem2.txt -Encoding Oem
$test | Set-Content C:\テスト\テスト_String.txt -Encoding String
$test3 | Set-Content C:\テスト\テスト_String2.txt -Encoding String
$test | Set-Content C:\テスト\テスト_Unicode.txt -Encoding Unicode
$test | Set-Content C:\テスト\テスト_Unknown.txt -Encoding Unknown
$test | Set-Content C:\テスト\テスト_UTF32.txt -Encoding UTF32
$test | Set-Content C:\テスト\テスト_UTF7.txt -Encoding UTF7
$test | Set-Content C:\テスト\テスト_UTF8.txt -Encoding UTF8

Write-Host "C:\テスト\テスト_Ascii.txt : " (.\nkf.exe -g C:\テスト\テスト_Ascii.txt)
Write-Host "C:\テスト\テスト_BigEndianUnicode.txt : " (.\nkf.exe -g C:\テスト\テスト_BigEndianUnicode.txt)
Write-Host "C:\テスト\テスト_Byte.txt : " (.\nkf.exe -g C:\テスト\テスト_Byte.txt)
Write-Host "C:\テスト\テスト_Byte2.txt : " (.\nkf.exe -g C:\テスト\テスト_Byte2.txt)
Write-Host "C:\テスト\テスト_Default.txt : " (.\nkf.exe -g C:\テスト\テスト_Default.txt)
Write-Host "C:\テスト\テスト_Default2.txt : " (.\nkf.exe -g C:\テスト\テスト_Default2.txt)
Write-Host "C:\テスト\テスト_Oem.txt : " (.\nkf.exe -g C:\テスト\テスト_Oem.txt)
Write-Host "C:\テスト\テスト_Oem2.txt : " (.\nkf.exe -g C:\テスト\テスト_Oem2.txt)
Write-Host "C:\テスト\テスト_String.txt : " (.\nkf.exe -g C:\テスト\テスト_String.txt)
Write-Host "C:\テスト\テスト_String2.txt : " (.\nkf.exe -g C:\テスト\テスト_String2.txt)
Write-Host "C:\テスト\テスト_Unicode.txt : " (.\nkf.exe -g C:\テスト\テスト_Unicode.txt)
Write-Host "C:\テスト\テスト_Unknown.txt : " (.\nkf.exe -g C:\テスト\テスト_Unknown.txt)
Write-Host "C:\テスト\テスト_UTF32.txt : " (.\nkf.exe -g C:\テスト\テスト_UTF32.txt)
Write-Host "C:\テスト\テスト_UTF7.txt : " (.\nkf.exe -g C:\テスト\テスト_UTF7.txt)
Write-Host "C:\テスト\テスト_UTF8.txt : " (.\nkf.exe -g C:\テスト\テスト_UTF8.txt)

【実行結果】
PS C:\テスト> C:\テスト\テスト.ps1
C:\テスト\テスト_Ascii.txt : ASCII
C:\テスト\テスト_BigEndianUnicode.txt : UTF-16
C:\テスト\テスト_Byte.txt : CP932
C:\テスト\テスト_Byte2.txt : Shift_JIS
C:\テスト\テスト_Default.txt : CP932
C:\テスト\テスト_Default2.txt : Shift_JIS
C:\テスト\テスト_Oem.txt : CP932
C:\テスト\テスト_Oem2.txt : Shift_JIS
C:\テスト\テスト_String.txt : CP932
C:\テスト\テスト_String2.txt : Shift_JIS
C:\テスト\テスト_Unicode.txt : UTF-16
C:\テスト\テスト_Unknown.txt : UTF-16
C:\テスト\テスト_UTF32.txt : UTF-32
C:\テスト\テスト_UTF7.txt : ASCII
C:\テスト\テスト_UTF8.txt : UTF-8

PowerShellでファイルを「Shift_JIS」にエンコードして出力してみる。。。

これが一番単純で簡単かな?
例)
Get-Content "C:test\test1.txt" | Set-Content "C:test\test2.txt" -Encoding String -Force

※Get-ContentのほうもEncodingオプションつけれるから、状況に応じて・・・
それに、エンコードは他にも方法はあるし・・・、状況に応じて・・・

PowerShellの Out-File と Set-Content あるいは Out-File -Append と Add-Content の違い - tech.guitarrapc.cóm

PowerShellで複数のファイルの文字コードを一括変換する − @IT

PowerShellの出力系コマンドレットのエンコーディングについて: モジバケーション