明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4167|回复: 13

[经验] WScript.Shell

[复制链接]
发表于 2020-7-6 16:05:13 | 显示全部楼层 |阅读模式
本帖最后由 1291500406 于 2020-7-17 11:58 编辑


  • WScript.Shell是WshShell对象的ProgID,
  • 创建WshShell对象可以运行程序、操作注册表、创建快捷方式、访问系统文件夹、管理环境变量。
  • WshShell 对象

  • ProgID WScript.Shell
  • 文件名 wshom.ocx
  • CLSID F935DC22-1CF0-11d0-ADB9-00C04FD58A0B
  • IID F935DC21-1CF0-11d0-ADB9-00C04FD58A0B


  • 创建WScript.Shell对象
  • (set 'IWshShell(vlax-create-object"WScript.Shell"))
  • #<VLA-OBJECT IWshShell3 080be980>
  • (set 'IWshShell(vlax-create-object"{72c24dd5-d70a-438b-8a42-98424b88afb8}"))
  • #<VLA-OBJECT IWshShell3 080b1510>
  • (set 'IWshShell(vlax-create-object"WScript.Shell.1"))
  • #<VLA-OBJECT IWshShell3 080be620>
  • (set 'IWshShell(vlax-create-object"{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}"))
  • #<VLA-OBJECT IWshShell3 080be6e0>


(vlax-dump-object IWshShell t)
; IWshShell3: Shell Object Interface
;特性值:
;   CurrentDirectory = ...不显示带索引的内容...
;支持的方法:
;   Exec (2)
T


;特性值:
  • CurrentDirectory 返回或改变当前目录

;;; { get; set; }

(Vlax-get-Property IWshShell  'CurrentDirectory   )

;;;; "C:\\Users\\必强\\Documents"

(Vlax-put-Property IWshShell  'CurrentDirectory   "C:\\")

;;;;nil

(Vlax-get-Property IWshShell  'CurrentDirectory   )

;;;;"C:\\"


  • Environment 返回 WshEnvironment 集合对象。

;;Environment对象指定环境变量所处的位置有System、User、Volatile和Process

;;注意: Environment对象返回的是一个WshEnvironment对象
       ;;Environment对象的详细用法


(setq  IWshEnvironment  (Vlax-get-Property IWshShell  ' Environment ))

;;;; #<VLA-OBJECT IWshEnvironment 0000014bfecdf100>

;;{ get; }


(vlax-dump-object IWshEnvironment  t)


; IWshEnvironment: Environment Variables Collection Object
;特性值:
;   Item = ...不显示带索引的内容...
;   length (RO) = ...不显示带索引的内容...
;支持的方法:
;   Count (1)
;   Remove (1)
;   _NewEnum (1)
T



(Vlax-get-Property  IWshEnvironment  "Item" "PROCESSOR_REVISION" )

;;"8e0c"

;;以下是Environment返回的对象的使用参数
NUMBER_OF_PROCESSORS 运行的处理器数目。
PROCESSOR_ARCHITECTURE 用户工作站使用的处理器类型。
PROCESSOR_IDENTIFIER 用户工作站的处理器 ID。
PROCESSOR_LEVEL 用户工作站的处理器级别。
PROCESSOR_REVISION 用户工作站的处理器版本号。
OS 用户工作站所用的操作系统的类型。
COMSPEC 命令提示符命令。
HOMEDRIVE 本地主驱动器(常为 C 驱动器)。
HOMEPATH 用户的默认路径(在 Windows NT 上通常为 \\users\\default)。
PATH 计算机中配置的path环境变量。
PATHEXT 可执行文件的扩展名。
PROMPT 命令提示符(通常为 $P$G)。
SYSTEMDRIVE 系统所在的本地驱动器(一般是c:\\)。
SYSTEMROOT 系统目录(例如,c:\\winnt)。和 WINDIR 相同。
WINDIR 系统目录(例如 c:\\winnt)。和 SYSTEMROOT 相同。
TEMP 存储临时文件的目录(例如,c:\\temp)。用户可更改。
TMP 存储临时文件的目录(例如,c:\\temp)。用户可更改。

(Vlax-get-Property IWshEnvironment  'length )

18
(Vlax-get-Property IWshEnvironment  'Item  1)

""
(Vlax-Invoke-Method IWshEnvironment  'Count )

18
(Vlax-Invoke-Method IWshEnvironment  'Remove  "PROCESSOR_REVISION" )
(系统变量别瞎删)

(Vlax-Invoke-Method IWshEnvironment   "_NewEnum" )

#<IUnknown 080b0d80>



  • 3. SpecialFolders 使用 WshSpecialFolders
  • 对象提供对 Windows shell 文件夹的访问,如桌面文件夹, 开始菜单文件夹和个人文档文件夹。

(setq IWshCollection (Vlax-get-Property IWshShell  ' SpecialFolders  ))

;;;返回值
;;;; #<VLA-OBJECT IWshCollection 0000014b98d09b10>
;;; { get; }
(vlax-dump-object IWshCollection  t)

; IWshCollection: Generic Collection Object
;特性值:
;   length (RO) = ...不显示带索引的内容...
;支持的方法:
;   Count (1)
;   Item (2)
;   _NewEnum (1)
T

Item 指定文件夹的完整路径(默认)。

Count 枚举项的数目。

length 枚举项的数目 。


(Vlax-get-Property IWshCollection 'length )
18
(Vlax-Invoke-Method IWshCollection   'Count )
18
(Vlax-Invoke-Method
IWshCollection
  ' Item  0)
"C:\\Users\\Public\\Desktop"

(Vlax-Invoke-Method IWshCollection   ' Item  1)
"C:\\ProgramData\\Microsoft\\Windows\\Start Menu"
0............17
(Vlax-Invoke-Method IWshCollection   ' Item  17)
"C:\\Users\\必强\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs"

(Vlax-Invoke-Method IWshCollection   ' Item  "AllUsersDesktop")


"C:\\Users\\Public\\Desktop"

Windows 95 和 Windows NT 4.0操作系统提供下列指定文件夹:

AllUsersDesktop

AllUsersStartMenu

AllUsersPrograms

AllUsersStartup

Desktop

Favorites

Fonts

MyDocuments

NetHood

PrintHood

Programs

Recent

SendTo

StartMenu

Startup

Templates


(Vlax-Invoke-Method IWshCollection   ' _NewEnum )
#<IUnknown 080b0e20>



激活一个应用程序窗口。
CreateShortcut
创建并返回 WshShortcut 对象。
Exec
在子命令窗口中运行一个应用程序,提供访问StdIn/StdOut/StdErr流。
ExpandEnvironmentStrings
扩展 PROCESS环境变量并返回结果字符串。
LogEvent
添加一个事件到日志文件。
Popup
显示包含指定消息的消息窗口。
RegDelete
从注册表中删除指定的键或值。
RegRead
从注册表中返回指定的键或值。
RegWrite
在注册表中设置指定的键或值。
Run
创建新的进程,该进程用指定的窗口样式执行指定的命令。
SendKeys
发送一个或多个按键到活动窗口


AppActivate方法的演示(激活一个应用程序窗口。)
CreateShortcut方法的演示(创建并返回 WshShortcut 对象。)
ExpandEnvironmentStrings方法的演示(扩展 PROCESS环境变量并返回结果字符串。
LogEvent方法的演示(添加一个事件到日志文件。
RegDelete方法的演示(从注册表中删除指定的键或值。)
RegRead方法的演示(从注册表中返回指定的键或值。)
RegWrite方法的演示(在注册表中设置指定的键或值。)


Run方法的演示(创建新的进程,该进程用指定的窗口样式执行指定的命令。)

(vlax-invoke (vla-GetInterfaceObject (vlax-get-acad-object) "WScript.Shell")"run" path)

Exec方法的演(外部控制台应用)
(defun $bb_getfile ( / bb cc)(setq bb(vlax-invoke-method  (vlax-create-object "WScript.Shell")'exec"mshta vbscript:\"<html>
<input  type=file id=path><script>path.click();new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(path.value);close
();resizeTo(0,0);</script></html>\""))(if (/=(setq cc(vl-string-right-trim"\r\n"(vlax-invoke (vlax-get bb 'StdOut) 'ReadAll)))"")cc nil))

;;测试 ($bb_getfile)
"C:\\Python27amd64\\python.exe"

Popup方法的演示(警告提示框)

;;wsh.Popup(strText,[nSecondsToWait],[strTitle],[nType])
(defun bbalert  (a b c d)
(vlax-invoke (vla-GetInterfaceObject (vlax-get-acad-object) "WScript.Shell")"popup" a b c d)(princ))

;测试
  • ( bbalert  "显示确定按钮" 2 "必强提示1" 0)
  • ( bbalert  "显示“确定”和“取消”按钮。" 2 "必强提示2" 1)
  • ( bbalert  "显示中止、重试和忽略按钮。" 2 "必强提示3" 2)
  • ( bbalert  "显示“是”、“否”和“取消”按钮。" 2 "必强提示4" 3)
  • ( bbalert  "显示“是”和“否”按钮。" 2 "必强提示5" 4)
  • ( bbalert  "显示“重试”和“取消”按钮。" 2 "必强提示6" 5)
  • ( bbalert  "显示“取消”,再试一次,然后继续按钮。" 2 "必强提示7" 6)
  • ( bbalert  "显示停止标记图标。" 2 "必强提示8" 16)
  • ( bbalert  "显示问题图标" 2 "必强提示9" 32)
  • ( bbalert  "显示感叹号图标。" 2 "必强提示10" 48)
  • ( bbalert  "标记的图标显示的信息。" 2 "必强提示11" 64)
  • ( bbalert  "第二个按钮是默认按钮。" 2 "必强提示12" 256)
  • ( bbalert  "第三个按钮是默认按钮。" 2 "必强提示13" 512)
  • ( bbalert  "消息框是系统模式消息框,显示在最顶部的窗口中。" 2 "必强提示14" 4096)
  • ( bbalert "文本右对齐。" 2 "Title15" 524288)
  • ( bbalert  "消息和标题文本按从右到左的阅读顺序显示。" 2 "必强提示16" 1048576)


;; 显示 windows 的确认对话框包括图标和可选按钮   2020.7.11
;;用法: (vldos-msgbox TitleString[STRING] IconType[STRING/REAL] MessageString[STRING] ButtonType[INT] )

;;  参数1: 标题字符串, 如果是 nil, 缺省为 "Message"
;;  参数2: 图标类型字符串或整数值. 如果是字符串, 只有第一个字符串有效.
;;  参数3: 消息字符串, 如果是 nil, 缺省为 "Message HERE"
;;  参数4: 按钮类型整数值.
;;返回值: 所选按钮的值 OR NIL
;|;;按钮
;;0  OK
;;1  OK and Cancel
;;2  Abort, Retry, and Ignore
;;3  Yes, No, Cancel
;;4  Yes and No
;;5  Retry and Cancel
;;图标类型
;;16 [X] Stop Mark icon
;;32 [?] Question Mark icon
;;48 [!] Exclamation Mark icon
;;64  Information Mark icon
;; 返回值所代表的按钮
;;1  OK button
;;2  Cancel button
;;3  Abort button
;;4  Retry button
;;5  Ignore button
;;6  Yes button
;;7  No button
|;
(Defun vldos-msgbox (TITLE ICON MSG BTNS / IDT sys BTN)
  (if (setq sys (vlax-get-or-create-object "WScript.Shell"))
    (progn
      (if (not (equal (type TITLE) 'STR))
(setq TITLE "Message")
      )
      (cond ((null ICON) (setq ICON 64))
     ((= (type ICON) 'STR)
      (setq ICON (substr (strcase ICON) 1 1)
     IDT (list (cons "X" 16)
         (cons "?" 32)
         (cons "!" 48)
         (cons "i" 64)
   )
     ICON (cdr (assoc ICON IDT))
      )
      (if (null ICON)
        (setq ICON 64)
      )
     )
     ((= (type ICON) 'INT)
      (if (null (member ICON (list 16 32 48 64)))
        (setq ICON 64)
      )
      (t (setq ICON 64))
     )
      )
      (if (not (equal (type MSG) 'STR))
(setq MSG "Message HERE")
      )
      (cond ((null BTNS) (setq BTNS 0))
     ((= (type BTNS) 'INT)
      (if (or (< BTNS 0) (> BTNS 5))
        (setq BTNS 0)
      )
     )
     (t (setq BTNS 0))
      )
      (setq
BTN (vlax-invoke-method sys 'popup MSG 0 TITLE (+ ICON BTNS))
      )
      (vlax-release-object sys)
    )
  )
  BTN
)



SendKeys方法的演示(发送一个或多个按键到活动窗口

(defun SendKeys (keys / ws)
        (setq ws (vlax-create-object "WScript.Shell"))
        (vlax-invoke-method ws 'sendkeys keys)
        (vlax-release-object ws)
        (princ)
   )


;;测试 (sendkeys "recover ")

SendKeys string[, wait]

参数意义

string部分必需的,字符串表达式,指定要发送的按键消息。

Wait可选的,指定等待方式的值。如果为 False(缺省值),则控件在按键发送出去之后立刻返回到过程;如果为 True,则按键消息必须在控件返回到过程之前加以处理。说明每个按键由一个或多个字符表示。


用法

1)为了指定单一键盘字符,必须按字符本身的键。例如,为了表示字母 A,可以用 "A" 作为 string。为了表示多个字符,就必须在字符后面直接加上另一个字符。例如,要表示 A、B 及 C,可用 "ABC" 作为 string。

2)对 SendKeys 来说,加号+ 、插入符^ 、百分号% 、上划线~ 及圆括号( ) 都具有特殊意义。为了指定上述任何一个字符,要将它放在大括号{}当中。例如,要指定正号,可用 {+} 表示。为了指定大括号字符,请使用 {{} 及 {}}。方括号 [ ] 对 SendKeys 来说并不具有特殊意义,但必须将它们放在大括号中。在其它应用程序中,方括号有特殊意义,在出现动态数据交换 (DDE) 的时候,它可能具有重要意义。

3)为了在按下按键时指定那些不显示的字符,例如 ENTER 或 TAB 以及那些表示动作而非字符的按键,请使用下列代码:

按键
代码
BACKSPACE
{BACKSPACE}, {BS}或{BKSP}
BREAK
{BREAK}
CAPS LOCK
{CAPSLOCK}
DEL or DELETE
{DELETE} 或 {DEL}
ENTER
{ENTER}或 ~
ESC
{ESC}
NUM LOCK
{NUMLOCK}
SCROLL LOCK
{SCROLLLOCK}
UP ARROW
{UP}
DOWN ARROW
{DOWN}
LEFT ARROW
{LEFT}
RIGHT ARROW
{RIGHT}
END
{END}
HOME
{HOME}
INS or INSERT
{INSERT} 或 {INS}
PAGE DOWN
{PGDN}
PAGE UP
{PGUP}
PRINT SCREEN
{PRTSC}
WIN
^{ESC}
TAB
{TAB}
HELP
{HELP}
F1
{F1}
F2
{F2}
F3
{F3}
F4
{F4}
F5
{F5}
F6
{F6}
F7
{F7}
F8
{F8}
F9
{F9}
F10
{F10}
F11
{F11}
F12
{F12}
注意:如果要输出空格可以这样编写程序:“sendkeys(" ")"

4)为了指定那些与 SHIFT、CTRL 及 ALT 等按键结合的组合键,可在这些按键码的前面放置一个或多个代码,这些代码列举如下:

按键
代码
SHIFT
+
CTRL
^
ALT
%
5)为了说明在按下其它按键时应同时按下 SHIFT、CTRL、及 ALT 的任意组合键,请把那些按键的码放在括号当中。例如,为了说明按下 E 与 C 的时候同时按下 SHIFT 键,请使用 "+(EC)"。为了说明在按下 E 的时候同时按下 SHIFT 键,但接着按 C 而不按 SHIFT,则使用 "+EC"。

6)为了指定重复键,使用 {key number} 的形式。必须在 key 与 number 之间放置一个空格。例如,{LEFT 42} 意指 42 次按下 LEFT ARROW 键;{h 10} 则是指 10 次按下 H 键。

注意:

  • SendKeys 不能将按键消息发送到这样一个应用程序——这个应用程序并没有被设计成在 Microsoft Windows 中运行。
  • Sendkeys 也无法将PRINT SCREEN 按键发送到任何应用程序。

Function AppActivate(App, [Wait]) As Boolean

Function CreateShortcut(PathLink As String) As Object

Property CurrentDirectory As String

Property Environment([Type]) As WshEnvironment '只读

Function Exec(Command As String) As WshExec

Function ExpandEnvironmentStrings(Src As String) As String

Function LogEvent(Type, Message As String, [Target As String]) As Boolean

Function Popup(Text As String, [SecondsToWait], [Title], [Type]) As Long

Sub RegDelete(Name As String)

Function RegRead(Name As String)

Sub RegWrite(Name As String, Value, [Type])

Function Run(Command As String, [WindowStyle], [WaitOnReturn]) As Long

Sub SendKeys(Keys As String, [Wait])

Property SpecialFolders As WshCollection '只读


相关对象

WshCollection 对象


Function Count() As Long

Function Item(Index) '缺省

Property length As Long '只读

WshEnvironment 对象

Function Count() As Long

Property Item(Name As String) As String '缺省

Property length As Long '只读

Sub Remove(Name As String)

WshExec 对象

Property ExitCode As Long '只读

Property ProcessID As Long '只读

Property Status As WshExecStatus '只读

Property StdErr As TextStream '只读

Property StdIn As TextStream '只读

Property StdOut As TextStream '只读

Sub Terminate()

WshExecStatus 常数

Const WshFailed = 2

Const WshFinished = 1

Const WshRunning = 0

WshShortcut 对象

Property Arguments As String

Property Description As String

Property FullName As String '只读 缺省

Property Hotkey As String

Property IconLocation As String

Property RelativePath As String

Sub Save()

Property TargetPath As String

Property WindowStyle As Long

Property WorkingDirectory As String

WshURLShortcut 对象

Property FullName As String '只读 缺省

Sub Save()

Property TargetPath As String

WshWindowStyle 常数

Const WshHide = 0

Const WshMaximizedFocus = 3

Const WshMinimizedFocus = 2

Const WshMinimizedNoFocus = 6

Const WshNormalFocus = 1

Const WshNormalNoFocus = 4



这些函数都定义在wshom.ocx文件里,
那怎样制作一个ocx文件,来扩展lisp功能?
想要进一步去学,就会跳转至 VB  VB.NET  C  C++  C#等高级语言区

评分

参与人数 3明经币 +2 金钱 +10 收起 理由
tigcat + 10 很给力!
xvjiex + 1 赞一个!
tryhi + 1

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2020-7-10 09:48:03 | 显示全部楼层
eCosmos 发表于 2020-7-9 10:49
高手,这是自己造的厉害函数吗?

应该是电脑系统自带的,微软的,提供对象接口供程序员用各种语言编写代码来操控对应对象,还有个常用来操控文件夹之类的对象,Scripting.FileSystemObject对象
 楼主| 发表于 2020-7-12 10:20:16 | 显示全部楼层
本帖最后由 1291500406 于 2020-7-12 10:22 编辑
gdslqs 发表于 2020-7-10 09:48
应该是电脑系统自带的,微软的,提供对象接口供程序员用各种语言编写代码来操控对应对象,还有个常用来操 ...

Scripting.FileSystemObject对象,我就不写了
 楼主| 发表于 2020-7-12 10:19:55 | 显示全部楼层
本帖最后由 1291500406 于 2020-7-12 10:22 编辑
gdslqs 发表于 2020-7-10 09:48
应该是电脑系统自带的,微软的,提供对象接口供程序员用各种语言编写代码来操控对应对象,还有个常用来操 ...

Scripting.FileSystemObject对象,你行,你来写
发表于 2020-7-7 14:49:00 | 显示全部楼层
太厉害了,膜拜。
发表于 2020-7-8 09:59:52 | 显示全部楼层
小伙子牛逼,发现你每次发的东西,都研究的很深入。
发表于 2020-7-8 10:14:54 | 显示全部楼层
强哥人才啊,被耽误的程序员
发表于 2020-7-9 10:48:59 | 显示全部楼层
高手,这是自己造的厉害函数吗?
发表于 2020-7-9 10:49:13 | 显示全部楼层
高手,这是自己造的厉害函数吗?
发表于 2020-7-12 23:37:44 来自手机 | 显示全部楼层
64位元。WshShell 怎么得到最高权限,才能注册Dll
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-1 10:48 , Processed in 0.208013 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表