[分享]细说shell函数——不得不看!

本文深入解析了VBA中的Shell函数及其强大功能,同时还详细介绍了如何使用Rundll32来调用DLL文件中的命令参数,实现各种系统操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

这篇帖子也许有点长,但是绝对值得一看。

shell 是啥?它既不是工作表函数,也不是api函数,更不是壳牌石油。它是vba自带的函数。
但是它却神通广大,能抵n个api函数,api是应用程序接口,shell就是应用程序和系统之间的桥梁。
它的用法很简单,就是执行一个可执行文件。与开始菜单的运行功能一样。
Shell(pathname[,windowstyle])
pathname 是要执行的程序名,可能还包括目录或文件夹
Windowstyle 表示在程序运行时窗口的样式
具体的说明,请查看vba的帮助。

#基本用法
Shell("C:/Program Files/Winamp/Winamp.exe", 1)  给出路径直接执行某个exe程序。

如果是windows的程序可以直接输入程序名,如:
Shell "explorer.exe c:", 1     打开C盘。
Shell "control.exe"      打开控制面板 ,甚至可以简写 Shell"control"
shell "control.exe appwiz.cpl"   打开控制面板-添加/删除程序
Shell "control.exe sysdm.cpl @1"      添加新硬件
Shell "control.exe sysdm.cpl"      系统
Shell "control.exe appwiz.cpl"      添加/删除程序
Shell "control.exe inetcpl.cpl"      Internet 属性
Shell "control.exe intl.cpl"      区域设置
Shell "control.exe joy.cpl"      游戏控制器
Shell "control.exe main.cpl"      鼠标
Shell "control.exe mmsys.cpl"      多媒体
Shell "control.exe modem.cpl"      调制解调器
Shell "control.exe netcpl.cpl"      网络
Shell "control.exe Password.cpl"      密码
Shell "control.exe powercfg.cpl"      电源管理
Shell "control.exe sticpl.cpl"      扫描仪与数字像机
Shell "control.exe timedate.cpl"      日期/时间
Shell "control.exe telephon.cpl"      拔号网络
Shell "control.exe odbccp32.cpl"      OBDC 数据源管理器
Shell "control.exe desk.cpl"     显示
Shell "calc.exe"   计算器
Shell "mspaint.exe"   画图
..............

shell函数本身并不强大,就像刘邦,是他手下的人厉害。
shell函数有几个帮手
1、cmd.exe
cmd能够执行几乎所有的dos命令,想想dos有多少命令把,shell都可以实现。
Shell "cmd.exe"       打开cmd窗口
Shell "cmd.exe /c copy c:/1.txt d:/"  把c盘的1.txt文件复制到d盘。
Shell "cmd.exe /c ping 127.0.0.1" ping ip
Shell "cmd.exe /c del c:/1.txt"  删除1.txt
................

还有很多命令,可以在cmd窗口输入help查看。
cmd后面的/c 是啥?
/C 执行字符串指定的命令然后终断
/K 执行字符串指定的命令但保留
/S 在 /C 或 /K 后修改字符串处理(见下)
/Q 关闭回应
/D 从注册表中停用执行 AutoRun 命令(见下)
/A 使向内部管道或文件命令的输出成为 ANSI
/U 使向内部管道或文件命令的输出成为 Unicode
/T:fg 设置前景/背景颜色(详细信息,请见 COLOR /?)
/E:ON 启用命令扩展(见下) /E:OFF 停用命令扩展(见下)
/F:ON 启用文件和目录名称完成字符 (见下)
/F:OFF 停用文件和目录名称完成字符(见下)
/V:ON 将 c 作为定界符启动延缓环境变量扩展。如:
/V:ON 会 允许 !var! 在执行时允许 !var! 扩展变量 var。
var 语法 在输入时扩展变量,这与在一个 FOR 循环内不同。
/V:OFF 停用延缓的环境扩展。

具体的说明可以cmd窗口输入cmd /? ,然后一路回车。

2、Rundll32.exe
这个帮手不得了,功能太强了。
所谓Rundll,run就是运行,dll是动态链接库,所以他的功能就是运行那些不能作为程序
单独运行的DLL文件。Rundll32.exe则用来运行32位DLL文件,Windows 98代码夹杂着16位和32位,
所以同时具有Rundll32.exe和Rundll.exe两个程序。Windows 2000/XP都是NT内核系统,
其代码都是纯32位的,所以在这两个系统中,就没有rundll.exe这个程序。
在system32目录下,有很多dll文件,每个dll里又有很多的命令参数。
常见命令及参数:
命令: rundll32.exe shell32.dll,Control_RunDLL
功能: 显示控制面板
命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,1
功能: 显示“控制面板-辅助选项-键盘”选项窗口
命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,2
功能: 显示“控制面板-辅助选项-声音”选项窗口
命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,3
功能: 显示“控制面板-辅助选项-显示”选项窗口
命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,4
功能: 显示“控制面板-辅助选项-鼠标”选项窗口
命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,5
功能: 显示“控制面板-辅助选项-传统”选项窗口
命令: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl @1
功能: 执行“控制面板-添加新硬件”向导。
命令: rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL AddPrinter
功能: 执行“控制面板-添加新打印机”向导。
命令: rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,1
功能: 显示 “控制面板-添加/删除程序-安装/卸载” 面板。
命令: rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,2
功能: 显示 “控制面板-添加/删除程序-安装Windows” 面板。
命令: rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,3
功能: 显示 “控制面板-添加/删除程序-启动盘” 面板。
命令: rundll32.exe syncui.dll,Briefcase_Create
功能: 在桌面上建立一个新的“我的公文包”。
命令: rundll32.exe diskcopy.dll,DiskCopyRunDll
功能: 显示复制软盘窗口
命令: rundll32.exe apwiz.cpl,NewLinkHere %1
功能: 显示“建立快捷方式”的对话框,所建立的快捷方式的位置由%1参数决定。
命令: rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,0
功能: 显示“日期与时间”选项窗口。
命令: rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,1
功能: 显示“时区”选项窗口。
命令: rundll32.exe rnaui.dll,RnaDial [某个拨号连接的名称]
功能: 显示某个拨号连接的拨号窗口。如果已经拨号连接,则显示目前的连接状态的窗口。
命令: rundll32.exe rnaui.dll,RnaWizard
功能: 显示“新建拨号连接”向导的窗口。
命令: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0
功能: 显示“显示属性-背景”选项窗口。
命令: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,1
功能: 显示“显示属性-屏幕保护”选项窗口。
命令: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,2
功能: 显示“显示属性-外观”选项窗口。
命令: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,3
功能: 显示显示“显示属性-属性”选项窗口。
命令: rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL FontsFolder
功能: 显示Windows的“字体”文件夹。
命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @3
功能: 同样是显示Windows的“字体”文件夹。
命令: rundll32.exe shell32.dll,SHformatDrive
功能: 显示格式化软盘对话框。
命令: rundll32.exe shell32.dll,Control_RunDLL joy.cpl,,0
功能: 显示“控制面板-游戏控制器-一般”选项窗口。
命令: rundll32.exe shell32.dll,Control_RunDLL joy.cpl,,1
功能: 显示“控制面板-游戏控制器-进阶”选项窗口。
命令: rundll32.exe mshtml.dll,PrintHTML (HTML文档)
功能: 列印HTML文档。
命令: rundll32.exe shell32.dll,Control_RunDLL mlcfg32.cpl
功能: 显示Microsoft Exchange一般选项窗口。
命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @0
功能: 显示“控制面板-鼠标” 选项 。
命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @1
功能: 显示 “控制面板-键盘属性-速度”选项窗口。
命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @1,,1
功能: 显示 “控制面板-键盘属性-语言”选项窗口。
命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @2
功能: 显示Windows“打印机”文件夹。
命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @3
功能: 显示Windows“字体”文件夹。
命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @4
功能: 显示“控制面板-输入法属性-输入法”选项窗口。
命令: rundll32.exe shell32.dll,Control_RunDLL modem.cpl,,add
功能: 执行“添加新调制解调器”向导。
命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,0
功能: 显示“控制面板-多媒体属性-音频”属性页。
命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,1
功能: 显示“控制面板-多媒体属性-视频”属性页。
命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,2
功能: 显示“控制面板-多媒体属性-MIDI”属性页。
命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,3
功能: 显示“控制面板-多媒体属性-CD音乐”属性页。
命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,4
功能: 显示“控制面板-多媒体属性-设备”属性页。
命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl @1
功能: 显示“控制面板-声音”选项窗口。
命令: rundll32.exe shell32.dll,Control_RunDLL netcpl.cpl
功能: 显示“控制面板-网络”选项窗口。
命令: rundll32.exe shell32.dll,Control_RunDLL odbccp32.cpl
功能: 显示ODBC32资料管理选项窗口。
命令: rundll32.exe shell32.dll,OpenAs_RunDLL {drive:/path/filename}
功能: 显示指定文件(drive:/path/filename)的“打开方式”对话框。
命令: rundll32.exe shell32.dll,Control_RunDLL password.cpl
功能: 显示“控制面板-密码”选项窗口。
命令: rundll32.exe shell32.dll,Control_RunDLL powercfg.cpl
功能: 显示“控制面板-电源管理属性”选项窗口。
命令: rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL  PrintersFolder
功能: 显示Windows“打印机”。(同rundll32.exe shell32.dll,Control_RunDLL  main.cpl @2)
命令: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,0
功能: 显示“控制面板-区域设置属性-区域设置”选项窗口。
命令: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,1
功能: 显示“控制面板-区域设置属性-数字”选项窗口。
命令: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,2
功能: 显示“控制面板-区域设置属性-货币”选项窗口。
命令: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,3
功能: 显示“控制面板-区域设置属性-时间”选项窗口。
命令: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,4
功能: 显示“控制面板-区域设置属性-日期”选项窗口。
命令: rundll32.exe desk.cpl,InstallScreenSaver [屏幕保护文件名]
功能: 将指定的屏幕保护文件设置为Windows的屏保,并显示屏幕保护属性窗口。
命令: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,0
功能: 显示“控制面板-系统属性-传统”属性窗口。
命令: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,1
功能: 显示“控制面板-系统属性-设备管理器”属性窗口。
命令: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,2
功能: 显示“控制面板-系统属性-硬件配置文件”属性窗口。
命令: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,3
功能: 显示“控制面板-系统属性-性能”属性窗口。
命令: rundll32.exe user.exe,restartwindows
功能: 强行关闭所有程式并重启机器。
命令: rundll32.exe user.exe,exitwindows
功能: 强行关闭所有程式并关机。
命令: rundll32.exe shell32.dll,Control_RunDLL telephon.cpl
功能: 显示“拨号属性”选项窗口
命令: rundll32.exe shell32.dll,Control_RunDLL themes.cpl
功能: 显示“桌面主旨”选项面板
。。。。。。。。。。
还有很多,光shell32.dll里就有好几百个参数,到system32目录下看看有多少dll,你会疯的,呵呵。
是不是觉得微软太BT了,哈哈,盖茨可不是盖的,要不人家咋成首富捏!

是不是想知道这些参数从哪里看呢?别集,往下看。
下面隆重为大家推荐一个相当牛×的软件——eXeScope,相信有不少人都用过他把。
这个软件很小,只有500k,但是功能却非常强大,能在没有资源文件的情况下分析、显示不同的信息,
重写可执行文件的资源,包括(EXE,DLL,OCX)等,享有”软件手术刀“的美名。
他的用途说上三天三夜也说不完,下面我就简单为大家介绍一下,你可以到网上搜索更多的内容。

第一大功能:汉化软件
不可思议把,是不是觉得汉化软件是很高深的东西,区区一个小软件居然能办到?是的,我也没办法。
第二大功能:自定义软件
大部分的软件,你都可以用eXeScope来自定义,包括windows的所有软件,如IE等。
如果你觉得软件的某个菜单、图标、快捷键不爽,你都可以自己改,可以改的面目全非,极具个性化。
你可以把QQ的等级改成50个太阳(只能自己看),呵呵。你可以把企鹅换成鸡、鸭甚至猪头。
看啥不爽你就改啥!我的软件我作主!
第三大功能:处理dll、ocx等文件
你可以直接用eXeScope打开dll或ocx文件,并对其进行修改。

<think>我们被要求解释SymPy库中lambdify函数的功能和使用方法,并给出示例。根据引用[1][2][3]的内容,我们可以总结如下: ### 功能概述 `lambdify`函数用于将SymPy符号表达式转换为可数值计算的函数。它类似于Python的lambda函数,但特别针对SymPy的符号表达式,并且能够将表达式中的符号函数映射到数值计算库(如NumPy)中的对应函数。这样,我们就可以用数值数组作为输入,高效地计算表达式的数值结果。 ### 使用场景 - 当需要对一个符号表达式在大范围数值点上进行计算时,使用`evalf`逐个计算效率低下,而`lambdify`转换后的函数可以高效地处理数组输入。 - 需要将符号表达式与数值计算库(如NumPy、SciPy)结合使用时。 ### 基本语法 ```python lambdify(args, expr, modules) ``` - `args`: 变量(符号或符号元组) - `expr`: 要转换的SymPy表达式 - `modules`: 指定使用的数值计算库(默认为"math",也可指定为"numpy"等) ### 使用示例 #### 示例1:基本用法(使用math库) ```python from sympy import symbols, sin, lambdify x = symbols('x') expr = 1 / sin(x) # 符号表达式:$ \frac{1}{\sin(x)} $ f = lambdify(x, expr) # 默认使用math库 # 计算单个值 print(f(3.14)) # 输出:627.8831939138764 [^1][^2] ``` #### 示例2:使用NumPy处理数组 ```python from sympy import symbols, lambdify import numpy as np x = symbols('x') expr = x**2 # 表达式:$ x^2 $ f = lambdify(x, expr, "numpy") # 指定使用NumPy a = np.arange(10) # 数组[0,1,...,9] print(f(a)) # 输出:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] [^3] ``` #### 示例3:多变量表达式 ```python from sympy import symbols, lambdify import numpy as np x, y = symbols('x y') expr = x**2 + y**2 f = lambdify((x, y), expr, "numpy") # 两个变量 # 生成网格点 X, Y = np.meshgrid(np.linspace(-1, 1, 5), np.linspace(-1, 1, 5)) print(f(X, Y)) # 计算网格上每个点的x^2+y^2 ``` ### 注意事项 1. **模块选择**:如果表达式中包含特殊函数(如贝塞尔函数),需要确保目标模块中有对应的函数。例如,使用SciPy中的特殊函数: ```python from sympy import besselj, symbols from scipy.special import jn # SciPy中的贝塞尔函数 import numpy as np x = symbols('x') expr = besselj(0, x) # 符号表达式中的贝塞尔函数 # 将SymPy的besselj映射到scipy的jn f = lambdify(x, expr, modules={'besselj': jn, 'sin': np.sin}) # 可以部分覆盖 print(f(1.0)) # 输出:0.7651976865579665 ``` 2. **错误处理**:如果转换后的函数遇到不支持的操作(如引用[4]中的错误),通常是因为模块映射不正确或输入类型不匹配。例如,当输入是浮点数而使用了numpy模块时,需要确保表达式中的函数在numpy中都有定义。 3. **性能**:对于大型数组,使用NumPy模块可以充分利用向量化计算,速度远快于循环调用`evalf`。 ### 总结 `lambdify`是连接符号计算和数值计算的桥梁。它允许我们将SymPy中复杂的符号表达式转换为高效的数值函数,从而能够利用NumPy等库进行大规模数值计算。在使用时,需要注意目标模块是否支持表达式中的所有函数,必要时可以自定义模块映射。 §§相关问题§§ 1. 如何解决`lambdify`转换后函数出现的`'float' object has no attribute 'sin'`错误? 2. 除了NumPy,`lambdify`还支持哪些数值计算库? 3. 如何将多个SymPy表达式同时转换为一个返回多个值的函数?</think>### SymPy `lambdify` 函数详解 `lambdify` 是 SymPy 的核心函数之一,用于将符号表达式转换为可数值计算的函数。其主要功能和使用方法如下: #### 核心功能 1. **符号到数值的转换** 将 SymPy 符号表达式(如 $x^2 + \sin(x)$)转换为可接受数值输入并输出数值结果的 Python 函数[^1][^2] $$ \text{SymPy 表达式} \xrightarrow{\text{lambdify}} \text{数值计算函数} $$ 2. **性能优化** 相比 `evalf()` 的逐点计算,`lambdify` 生成的函数支持向量化运算,处理大规模数据时效率提升显著[^1][^2] 3. **后端库支持** 默认使用 Python 标准库 `math`,也可指定 `numpy` 等数值库实现向量化计算[^3] #### 使用示例 ##### 基础用法 ```python from sympy import symbols, sin, lambdify x = symbols('x') expr = 1 / sin(x) # 符号表达式: $ \frac{1}{\sin(x)} $ # 转换为数值函数 f = lambdify(x, expr) print(f(3.14)) # 输出: 627.8831939138764 [^1][^2] ``` ##### 向量化计算(NumPy) ```python import numpy as np from sympy import Symbol, lambdify x = Symbol('x') expr = x**2 # $ x^2 $ # 指定使用 NumPy 后端 f_np = lambdify(x, expr, "numpy") arr = np.arange(5) # [0, 1, 2, 3, 4] print(f_np(arr)) # 输出: [0, 1, 4, 9, 16] [^3] ``` ##### 多变量表达式 ```python from sympy import symbols, lambdify import numpy as np x, y = symbols('x y') expr = x**2 + y**2 # $ x^2 + y^2 $ f = lambdify((x, y), expr) # 多变量输入 print(f(3, 4)) # 输出: 25 ``` #### 常见问题解决方案 1. **`'float' object has no attribute 'sin'` 错误** 当使用 NumPy 后端时,需确保输入为 NumPy 数组而非标量: ```python # 错误用法 f_np(3.14) # 输入标量会报错 # 正确用法 f_np(np.array([3.14])) # 输入 NumPy 数组 [^4] ``` 2. **自定义函数映射** 处理特殊函数(如贝塞尔函数)时需显式指定映射: ```python from scipy.special import jv # SciPy 的贝塞尔函数 from sympy import besselj f = lambdify(x, besselj(0, x), modules=[{'besselj': jv}, 'numpy']) ``` #### 最佳实践 1. **优先使用 NumPy 后端** ```python f = lambdify(x, expr, "numpy") # 向量化计算 ``` 2. **批量计算优化** 避免循环调用,直接传入数组: ```python # 低效 results = [f(val) for val in large_array] # 高效 results = f(large_array) # 一次处理整个数组 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值