千家信息网

PowerShell文件名包含[]时如何改后缀

发表于:2025-02-11 作者:千家信息网编辑
千家信息网最后更新 2025年02月11日,这篇文章主要介绍PowerShell文件名包含[]时如何改后缀,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!需求众所周知的问题,现在视频网站发布视频的方式方法已经有了很大的改变
千家信息网最后更新 2025年02月11日PowerShell文件名包含[]时如何改后缀

这篇文章主要介绍PowerShell文件名包含[]时如何改后缀,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

需求

众所周知的问题,现在视频网站发布视频的方式方法已经有了很大的改变。比如mp4文件改名为mp41,类似下面这样

PS E:\BaiduNetdiskDownload> ls *.mp41 -Recurse目?录?: E:\BaiduNetdiskDownloadMode                LastWriteTime         Length Name                                                                    ----                -------------         ------ ----                                                                    -a----        2019/8/11     20:42     1322066936 [SUBPIG][Eien no Nispa SP].mp41

然而实际按照

[SUBPIG][Eien no Nispa SP].mp41

这个文件名,用rename的方式去修改,却被提示失败。

PS E:\BaiduNetdiskDownload> Rename-Computer "[SUBPIG][Eien no Nispa SP].mp41" "[SUBPIG][Eien no Nispa SP].mp4"Rename-Computer : 找不到接受实际参数"[SUBPIG][Eien no Nispa SP].mp4"的位置形式参数。所在位置 行:1 字符: 1+ Rename-Computer "[SUBPIG][Eien no Nispa SP].mp41" "[SUBPIG][Eien no N ...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    + CategoryInfo          : InvalidArgument: (:) [Rename-Computer],ParameterBindingException    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.RenameComputerCommand

自动补齐

这是为什么呢?其实原因很简单,因为PowerShell中,对于[]符号有特殊的定义,所以不能这么写。
我们试试在命令行下直接运行它,系统会自动补齐什么样的字符转义

PS E:\BaiduNetdiskDownload> & '.\[SUBPIG][Eien no Nispa SP].mp41'

可以看到字符串前面有& 然后跟一个空格,字符串被' (单引号)包裹,这种方法可以用来运行一些包含了特殊字符的命令行工具,或者可执行程序,但是,在传递参数的时候还是用不了的。

我们试试,在某一个参数中,指定路径或者文件名,看系统自动补齐会变成什么样子

PS E:\BaiduNetdiskDownload> Rename-Item -Path '.\`[SUBPIG`]`[Eien no Nispa SP`].mp41'

大概这就是正确方式了吧,专门写了个函数

function EscapeWord ($param1) {    if ($param1 -match "[[]" -or $param1 -match "[]]") {        $param1.replace('[', '`[').replace(']', '`]')    }}EscapeWord "E:\BaiduNetdiskDownload\[SUBPIG][FAKE AFFAIR EP05].mp41"E:\BaiduNetdiskDownload\`[SUBPIG`]`[FAKE AFFAIR EP05`].mp41

先单独一条数据执行下

PS E:\BaiduNetdiskDownload> Rename-Item -Path '.\`[SUBPIG`]`[Eien no Nispa SP`].mp41' -NewName '.\`[SUBPIG`]`[Eien no Nispa SP`].mp4' Rename-Item : 指定路径 E:\BaiduNetdiskDownload\`[SUBPIG`]`[Eien no Nispa SP`].mp41 下的对象不存在。

实际来看,还是失败了。

变通解决

实在是挺无语的,既然[]在PowerShell下被重新定义了,那CMD下总是好的吧。用CMD来混合一下。这次的做法是切割名称字符串,把最后一个字符串切掉,然后替换名称。依然可以达到需求,并且修改记录还会追加保存在一个文件中。

(Get-ChildItem *.mp41 -Recurse) | ForEach-Object { $fullname = $_.fullname     $fullname    $NewName = $_.name    $NewName = ($NewName[0..($NewName.Length - 2)] -join "")    $NewName    $info = "rename `"$fullname`" `"$NewName`""    cmd /c $info    $info | Out-File c:\333.txt -Append -Force -Encoding utf8}

高亮测试

最终方案

问题是解决了,但是实现方法太拧巴。如果有原生方法,上面的操作还是不会考虑的。
我通过搜关键字

rename file PowerShell match []

在东家找到了下面一个最终极的方案。
https://answers.microsoft.com/en-us/windows/forum/windows_10-files/how-to-rename-image-files-in-a-folder-all-to-jpg/2a7e2873-e04b-472b-b239-afad2f2020fc

果然解决不了的时候直接上.net都是一件利器。

Get-ChildItem *.mp41 -Recurse | Rename-Item -newname { [io.path]::ChangeExtension($_.name, "mp4") }

在 https://stackoverflow.com/questions/5574648/use-regex-powershell-to-rename-files 也发现一个很有意思的替换方法,不过一样的,受限于[],不太适合我的场景。

Get-ChildItem *.mp41 | ForEach-Object{ Rename-Item $_ $(($_.name -replace '^filename_+','') -replace '_+',' ') }

以上是"PowerShell文件名包含[]时如何改后缀"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

字符 文件 方法 文件名 参数 字符串 实际 方式 还是 后缀 特殊 位置 内容 名称 命令 方案 时候 篇文章 系统 视频 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 个人购买网络服务器 广东数据库代码生成器售价 查询一个数据库所有表的大小 鹤岗bim软件开发工程 我的世界网易外国服务器 疫苗网络安全课视频观后感 深圳市风禾尽起网络技术有限公司 网络安全中采用什么 哈尔滨荷鲁斯网络技术 江苏专业软件开发报价表 软件开发学成要多久 互联网互联科技北京有限公司 智能网络与网络安全实验室 软件开发计划书范文案例 学网络安全要掌握什么 长宁区管理软件开发信息中心 用户数据库对新闻传播的作用 sql数据库如何恢复挂起 浙江智能化网络技术报价 河南正数网络技术有限公司郭运凯 串口服务器采集不回数据 集成电路软件开发 亚马逊服务器维护需要多少人 软件开发认证考试费用 网络安全存在问题的解决方案 华夏人生怎么开服务器 浏览器设定代理服务器 web 连接数据库 数据库分类汇报 .net数据库教程
0