Powershell脚本(3)——转bat批处理

wils

创作者俱乐部成员

问题来自马老师的帖子,是要逐行用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批处理,用户用起来也简单,改起来也不麻烦,可以极大的方便日常工作中的批量操作。

海南省
浏览 1077
收藏
8
分享
8 +1
3
+1
全部评论 3
 
嗯。。。 话说批量重命名我喜欢用表格,灵活,通用,简单,方便,爱咋改咋改 举个简单的例子,整理了一份文件夹材料,忽然新增了一个文件,要插入进去按要求重新编排文件目录,所有批量处理重命名的都很麻烦,还是excel表格灵活 唯一的缺点就是js宏不支持重命名函数,只能复制出来,不知道啥时候能看到新增
· 福建省
回复
wils

创作者俱乐部成员

其实,想用这种方式重命名,JS宏可以用shell执行ren函数,或者改用filecopy加kill命令实现 但从vba开始,这种方式就有个缺陷,就是不支持非中文的文件名,基本只要遇到特殊符号就会失败,因为表格本身不支持这些符号,不像脚本,支持更广的utf8编码的字符
· 广东省
回复