找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 18986|回复: 13

[问题求助] 用powershell生成Dll文件,在其它软件中调用

[复制链接]
发表于 2023-3-27 10:10:33 | 显示全部楼层 |阅读模式
本帖最后由 小白龙 于 2023-3-27 10:16 编辑

问题是这样的, 我用的一个软件, 它不支持正则中的平衡组, 但是它支持调用dll中的函数, 即然这样, 那能否把平衡组的功能导出为一个dll 然后我在我的软件中变相实现我要的功能呢, 请路过大佬支招, 多谢!

另外还有个小问题, PS直接调用DLL中的函数, 和 DLL中的类代码拷到PS中执行, 执行效率差多少? 怎样分别测试它们两种的执行时间呢?

powershell 是可以直接生成dll的, 我找到了一个小例子, 如下
  1. #生成dll
  2. Add-Type -TypeDefinition @'
  3. using System;

  4. public static class Cla
  5. {
  6.     public static void Fun(string s1)
  7.     {
  8.         Console.WriteLine(s1);
  9.     }
  10. }
  11. '@ -outputType library -outputAssembly ".\hello.dll"
复制代码
  1. #调用Dll中函数
  2. Add-Type -Path "$home\desktop\hello.dll"
  3. $s = "你好,世界!"
  4. [Cla]::Fun($s)
复制代码
关于用平衡组要解决的问题, 在下面贴子
http://www.bathome.net/thread-65471-1-1.html
发表于 2023-3-27 16:54:08 | 显示全部楼层
如果支持用powershell却不能用正则这么奇怪
是不是当命令行用时里面带有特殊号的原因
把命名组的><两个尖括号转义一下或者换成单引号 ‘ 试试
 楼主| 发表于 2023-3-27 17:50:02 | 显示全部楼层
回复 2# idwma


    多谢大佬,

支持PS也是用命令行的形式调用, 但是执行太慢了

支持调用DLL, 是软件自身功能,执行速度要快多了, 不少编程语言和软件不支持高级的正则, 好像C#的正则支持是最全的
发表于 2023-3-27 19:16:08 | 显示全部楼层
powershell中的生成dll是托管dll.只能由托管程序(dotnet编写的程序)调用,本机程序需要C++/CLI之类进行封装,不如直接调用powershell

效率的话估计就是动态编译类代码的时间差了,也没差多少,只是每次执行都要编译而已

正则引擎功能区别可以参考https://deerchao.cn/tutorials/regex/diffs.html
PCRE还是不错,虽然我喜欢RUBY的
 楼主| 发表于 2023-3-27 19:37:51 | 显示全部楼层
回复 4# Five66

感谢大佬指导, 这表真是太全面了, 我查了一下, 那个程序用的perl正则的引擎, 都不支持unicode字符

另外, C#可以生成com, 那个软件支持com, 应该比调用PS快太多了, 我是在虚拟机用的, 启动PS费时间
发表于 2023-3-27 20:01:42 | 显示全部楼层
回复 5# 小白龙

表参考下就行了,毕竟19年的表
com老古董了,挺复杂的,反正很难懂就是了

ps启动慢的确是个问题,应该可以生成C#程序然后调用吧(启动应该比ps快吧)
发表于 2023-3-28 15:29:31 | 显示全部楼层
参照帮助里的例子是这样嘛
  1. Add-Type -TypeDefinition @'
  2. using System;
  3. using System.Text.RegularExpressions;

  4. public static class Cla
  5. {
  6.     public static void Fun(string s1,string s2)
  7.     {
  8.         Regex rx = new Regex(s2);
  9.         MatchCollection matches = rx.Matches(s1);
  10.         Console.WriteLine(matches[0].Groups[0].Value);
  11.     }
  12. }
  13. '@ -outputType library -outputAssembly ".\hello.dll"

  14. Add-Type -Path "$home\desktop\hello.dll"
  15. $s = "你好,世界!123"
  16. [cla]::Fun($s,'\d+')
复制代码
 楼主| 发表于 2023-3-28 20:49:05 | 显示全部楼层
回复 7# idwma

多谢大佬,  确实在我的软件里很快就输出了, 比使用命令行的PS代码, 要快好几倍

怎么写下面贴子的平衡组的C#代码呢?  
http://www.bathome.net/thread-65471-1-1.html
发表于 2023-3-29 13:16:57 | 显示全部楼层
回复 8# 小白龙

现在不是已经写进去了吗
不清楚具体怎么用的,不会了
 楼主| 发表于 2023-3-29 23:44:14 | 显示全部楼层
本帖最后由 小白龙 于 2023-3-29 23:45 编辑

回复 9# idwma

请教大佬?

下面第三行中 的abc是变量$s2的值, 那正则应该怎么写呢? 里面怎么套个变量?

$s2='abc'
$s1='xzc abc(s "(abc)"); dfg()';
[regex]::Match($s1, 'abc\((??>[^()]*)|\((?<Open>)|\)(?<-Open>))*(?(Open)(?!))\)').Value;
发表于 2023-3-30 15:23:59 | 显示全部楼层
回复 10# 小白龙


    是这样拼接起来么
[regex]::Match($s1, $s2+'\((??>[^()]*)|\((?<Open>)|\)(?<-Open>))*(?(Open)(?!))\)').Value;
 楼主| 发表于 2023-3-31 09:43:40 | 显示全部楼层
回复 11# idwma

多谢大佬, 暂时先不用变量拼接了, 怕出转义问题, 有时间了再专门测试下
 楼主| 发表于 2023-4-11 20:48:22 | 显示全部楼层
本帖最后由 小白龙 于 2023-4-11 20:50 编辑

回复 7# idwma


    大佬, 上面#7楼的代码中用的下面这句, 只返回了第1组
Console.WriteLine(matches[0].Groups[0].Value);
但是我想输出所有组, 在C#中应该怎样写呢

例如下面这个例子输出了两组, 改成C#应该怎样改? 我的gpt现在用不了, 说使用太频繁了

cls
$text = "This is (a (test) string) with (nested (parentheses))."
[regex]::Matches($text, "(?x)\( ( [^()]* | (?<o>\() | (?<-o>\)) )*(?(o)(?!)) \)").Value
发表于 2023-4-11 21:02:12 | 显示全部楼层
回复 13# 小白龙


    之前参考文档写的,c#不会呀不知道怎么改
https://learn.microsoft.com/zh-c ... regular-expressions
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 23:22 , Processed in 0.021097 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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