Powershell脚本(3)——转bat批处理
创作者俱乐部成员
问题来自马老师的帖子,是要逐行用docx文件里的人名,新建一堆空白文件。
这个用宏确实可以做到,但大多数使用docx的用户,似乎不喜欢打开宏编辑器,运行代码。
所以需要把宏,变成单独一个越小越好的应用,用户只需双击运行即可。
首先想到的就是ahk,在windows里,可以方便的操作docx的com对象,再打包成独立的exe,用户双击运行即可。
相比于其他语言,ahk打包的exe小于1M,python之类的环境至少8M,c家族要么环境打包比较大,要么写起来难,ahk算是快速打包一个小巧exe最方便的选择。
但ahk也有缺点,用户大都希望自己可以修改部分代码,以适应需求的小变化。
那么,不需要安装运行环境,可以方便操作com对象,用户双击即可运行的脚本是啥,呃,可能就是bat批处理了。。。
但,bat太难了,坑多、工具旧、文档少,有时候ai写批处理都经常掉坑里
于是,就想着能不能把新的powershell脚本变成bat批处理,答案是肯定可以啊
🔔 | #&cls&powershell -NoProfile -NoLogo "gc '%~0'|out-string|iex"&pause&exit $wps = New-Object -ComObject kwps.application $d = $wps.Documents.Open((Resolve-Path a.docx).Path) $d.Paragraphs | %{ $t = $_.Range.Text.Trim() if ($t.Length -ne 0) { $a = $wps.Documents.Add() $a.SaveAs("$($d.Path)\$($t).docx") $a.Close() } } $d.Close() $wps.Quit() |
将这段存为bat文件,放到含有人名的docx相同文件夹,双击运行即可
代码第一行是从BatHome论坛学来的写法,利用了bat里#运行出错,同时powershell里#是注释的特点,通过一行代码,改用powershell执行当前脚本。
也可以把powershell换成busybox,以批处理方式执行linux shell脚本
也可以把powershell换成quickjs,以批处理方式执行js脚本,等等
需要注意的是代码中的pause,这会导致弹出命令行窗口,并等待用户随便按键(比如空格)才会退出,这是为了脚本一旦出错,错误提示一直保持在窗口上,方便调试,否则窗口一闪而逝,不知道执行出没出错。。。
后面的代码就是纯powershell写法了,通过wps文档的com对象,读取每一行获得人名,然后新建文档,以人名命名。
很多日常操作都可以用这种方式自动化,尤其在遍历文件,批量操作这方面。
再举个批量重命名的例子,当前文件夹里有很多子文件夹,子文件夹里有不同后缀的图片,要把每张图片重命名为:子文件夹名+序号+后缀,且不同后缀的图片分别排序。
📌 | #&cls&powershell -NoProfile -NoLogo "gc '%~0'|out-string|iex"&pause&exit dir -Directory | %{ $n = $_.Name $d = @{} dir $_.FullName | rni -NewName { $n + (++$d[$_.Extension]) + $_.Extension } } |
第一行还是小技巧,改用powershell执行当前批处理
然后列出所有子文件夹,逐个处理,%{}是foreach逐个处理的缩写
$n变量里存入当前子文件夹的名称
$d是新建一个空字典
然后遍历子文件夹里的图片文件,rni是rename-item的缩写,逐个重命名
命名的规则是,$n里的子文件夹名,连接上序号,连接上后缀
其中序号是在字典$d里,以文件后缀为键,值每次自增1,以实现根据不同后缀,从1开始排序图片
可以看出,powershell在遍历文件,批量处理方面,表达力非常强,代码也简洁可读性强,再改成bat批处理,用户用起来也简单,改起来也不麻烦,可以极大的方便日常工作中的批量操作。
创作者俱乐部成员