Shell関数経由でNKFが利用できない

Basicからテキストファイルの文字コードを把握したくNKFの利用を考えました。
しかし、Shell関数経由でNKF利用は、期待する結果を返してくれません。
同様のUNOサービス(SystemShellExecute)利用では、期待する結果を返します。
当方のShell関数利用に不備があるから期待する結果が返らないのでしょうか?

Shell関数は、第四パラメタで同期を指定することができるので、
できれば此方を使いたいです。

『これ以外でBasicからテキストファイルの文字コードを把握する
方法があれば、教えていただけると嬉しいです。』

以下が、検証用のソースコードです。環境は以下のとおり

  1. 検証Libre環境は 7.4.7.2(x64)です。
  2. 事前にD:\Tmp ディレクトリを作る。
    Shif_JIS文字コードのテキストファイル sjis.txtを前述のDirに格納
  3. 事前にベクターから nkf.exe nkf32.dll Windows用 2.1.1 をDL。
    このDLファイルからnkf32.exeを、すでにPathが通っている
    C:\Users\~\AppData\Local\Microsoft\WindowsAppsに格納します。

■以下検証用ソース■

Option Explicit
Option Base 0
Option Compatible

Private Sub M00_Main
	CompatibilityMode(True)
	Dim wCmd	as String
	Dim wPrm	as String
	wCmd	= "cmd"
	wPrm	= "/C nkf32 -g D:\tmp\sjis.txt >D:\tmp\"

	Dim wPrm1	as String
	wPrm1	= wPrm & "Ans1.txt"	
	Shell(wCmd, 2, wPrm1, True)
	
	Dim wObj	as Object
	Dim wPrm2	as String
	wObj	= CreateUnoService("com.sun.star.system.SystemShellExecute")
	wPrm2	= wPrm & "Ans2.txt"
	wObj.execute(wCmd, wPrm2, 0)
End Sub

試してみてwindowsの場合cmdやnkf32を実行できていないようです。

openofficeのフォーラムで見つけた記事
Use shell to run cmd dir in windows xp
によるとcmd.exeは実行できないがbatファイルなら実行できるということで、


D:\tmp\nkf.bat
@echo off
cmd /C nkf32 -g D:\tmp\sjis.txt

Private Sub M00b_Main
 	CompatibilityMode(true)
	Dim wCmd	as String
	Dim wPrm	as String
	wCmd	= "D:\tmp\nkf.bat"
	wPrm	= " > D:\tmp\"

	Dim wPrm1	as String
	wPrm1	= wPrm & "Ans1.txt"	
	Shell(ConverttoUrl(wCmd), 2, wPrm1, True)

	Dim wObj	as Object
	Dim wPrm2	as String
	wObj	= CreateUnoService("com.sun.star.system.SystemShellExecute")
	wPrm2	= wPrm & "Ans2.txt"
	wObj.execute(wCmd, wPrm2, 0)
	
End Sub

としたところ両方ともShift_JISになりました。

Version: 7.6.0.3 (X86_64) / LibreOffice Community
Build ID: 69edd8b8ebc41d00b4de3915dc82f8f0fc3b6265
CPU threads: 12; OS: Windows 10.0 Build 22621; UI render: Skia/Raster; VCL: win
Locale: ja-JP (ja_JP); UI: ja-JP
Calc: CL threaded
1 Like

余談ですが、
VBAではShell関数は非同期で処理されるみたいですね
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/shell-function

sabr0さん

対応方法や、関連情報の紹介ありがとうございます。
提示いただいた修正による稼働確認、当方でも再現できました。
※ただバッチファイルの外からリダイレクトだとNKFの結果以外もリダイレクトされますね

今回紹介いただいたサイトを読んで、Shell関数は下記”クセ”がある…と理解しました。

  • Dir等 Dosコマンドは Batファイルに包まないといけない
  • NKF等Dos画面で通常起動する外部コマンドは、Batファイルに
    包みさらに Cmd /C 経由で実行が必要なようだ
  • Shellの第一パラメタは、漢字等を含む場合 ConverttoUrlで
    変換して引き渡しが必要

さて、当初の目的であった 外部プログラムNKFを利用する方法ですが、

  • Shell関数経由だと、NKFをラップしたBatファイルの準備が必要、
    でも呼出し元と同期がとれる
  • Unoサービス(SystemShellExecute)だと、Batファイル不要で
    直接実行可能。ただ呼出し元と同期がとれない。
    (ただNKFから生成するファイルを監視するなどして
    間接的な同期は取れるハズ)

と一長一短ですので、利用背景を勘案しての選択になりそうです。

それにしても、私の問い合わせでOOo Forumまで検索していただき ありがとうございます。
当方も、今後 Ask書き込み前に Ask履歴以外にBugzillaや OOo Forum等検索してみることとします。
(当方の拙い知識・語彙力でどこまで 回答に行き着くか甚だ心もとないですが…)

諸々ありがとうございました。

1 Like