我可以从elisp中读取Windowsregistry吗? 怎么样?

我只想做这样的事情

(defun my-fun (reg-path) "reads the value from the given Windows registry path." ...??... ) 

有没有一个内置的FN这样做?

或者有一个命令行工具内置到Windows,我可以运行检索一个reg值?

我想象的做法是在cscript.exe中运行一个.js文件来完成这个工作。


回答

 (defun my-reg-read (regpath) "read a path in the Windows registry. This probably works for string values only. If the path does not exist, it returns nil. " (let ((reg.exe (concat (getenv "windir") "\\system32\\reg.exe")) tokens last-token) (setq reg-value (shell-command-to-string (concat reg.exe " query " regpath)) tokens (split-string reg-value nil t) last-token (nth (1- (length tokens)) tokens)) (and (not (string= last-token "value.")) last-token))) 

==>谢谢Oleg。

使用reg命令行实用程序。

Emacs命令

(shell-command "REG QUERY KeyName" &optional OUTPUT-BUFFER ERROR-BUFFER)

允许你运行一个shell命令。 输出被发送到OUTPUT-BUFFER

以下是我所做的:

 (defun my-reg-read (regpath) "read a path in the Windows registry" (let ((temp-f (make-temp-file "regread_" nil ".js")) (js-code "var WSHShell, value, regpath = '';try{ if (WScript.Arguments.length > 0){regpath = WScript.Arguments(0); WSHShell = WScript.CreateObject('WScript.Shell'); value = WSHShell.RegRead(regpath); WScript.Echo(value); }}catch (e1){ WScript.Echo('error reading registry: ' + e1);}") reg-value) (with-temp-file temp-f (insert js-code)) (setq reg-value (shell-command-to-string (concat temp-f " " regpath))) (delete-file temp-f) reg-value )) 

elisp函数创建一个临时文件,然后在其中写入一些javascript逻辑。 JavaScript读取给定路径的Windows注册表。 然后elisp fn运行临时文件,传递注册表路径来读取。 它删除文件,然后返回运行它的结果。