使用正则表达式进行PowerShell批量重命名?无法理解表达式。

4

我有一组文件,文件名称如下:

52 39 118 070 13200 5480.txt
83 39 010 392 01000 9970.txt
37 39 880 163 17802 0473.txt

我想将它们重命名为以下格式:

2012 文件描述 (52-39-118-070-13200-5480).txt
2012 文件描述 (83-39-010-392-01000-9970).txt
2012 文件描述 (37-39-880-163-17802-0473).txt

但是,我不知道对应的正则表达式是什么,也不知道如何在 PowerShell 中编码。我看到了很多删除空格或下划线的示例,但没有添加字符串的示例。

请注意,“2012 文件描述”对于所有被重命名的文件都是常量。我唯一想要改变的是将原始文件名移动到括号中,并将空格更改为破折号。

谢谢。


3
如果你只是在每个名称前面添加一个固定的短语,用括号将原始名称括起来,并且所有名称都以 .txt 扩展名结尾,那么普通字符串连接比正则表达式更适合(而且更容易理解如何实现)。 - Ken White
3个回答

8

你可以使用一行命令(直接管道到Rename-Item),但为了简单起见,我使用了Foreach-Object cmdlet:

Get-ChildItem -Filter *.txt | Foreach-Object{   
   $NewName = '2012 File Description ({0}){1}' -f ($_.BaseName -replace '\s','-'),$_.Extension
   Rename-Item -Path $_.FullName -NewName $NewName 
}

1
为了处理带有 '[' ']' 括号的文件名,应该使用 Rename-Item -LiteralPath 而不是 Rename-Item -Path。否则,Rename-Item 无法找到 $_.FullName。 - subsci

3
"52 39 118 070 13200 5480.txt" -replace "(.*)(\.txt)",'2012 File Description ($1)$2'

提供:

2012文件描述(52 39 118 070 13200 5480)。txt

重要提示:替换字符串使用单引号,因为如果在双引号中引用的字符串中出现美元符号“$”,则需要对其进行转义。 或者我可以这样写:

"52 39 118 070 13200 5480.txt" -replace "(.*)(\.txt)","2012 File Description (`$1)`$2"

谢谢Jon Z.,那个完美地解决了问题!话说,我该如何将空格改为破折号?ls | %{ren $_ $($_.name -replace '\s', '-')}我能够从另一个回答中摘取并修改它。但是我该如何将此函数嵌套到您描述的函数中?与此同时,我将先运行这个函数,然后再运行您的函数。 - toolshed
("52 39 118 070 13200 5480.txt" -replace "(.*)(.txt)",'2012 文件描述 ($1)$2') -replace "\s",'_' - jon Z
这将替换掉后面的空格。最终得到的文件名为2012_File_Description_(52_39_118_070_13200_5480).txt。 - toolshed
不错的捕获 - 尝试: ("52 39 118 070 13200 5480.txt" -replace "\s",'_') -replace "(.*)(.txt)",'2012年文件描述 ($1)$2' - jon Z
所以,还有两个快速问题。 为什么在匹配字符串时使用“”,但在替换字符串时使用'? 此外,$1和$2是否可以在括号外部工作?我能否从外部调用这些变量,并且它们会传递到下一个-replace命令吗? 我怀疑不行...对于结构的混乱表示抱歉。我无法使换行符起作用! - toolshed

1

这个不需要用正则表达式。就像Ken在评论中说的那样,你可以使用连接操作符(在Powershell中非常容易)。

类似于:

gci Y:\MyFolder -filter '*.txt' | % {rename-item -path $_.fullname -newname "2012 File Description`($($_.basename)`).txt"

有趣。我不知道这个,但我认为正则表达式仍然比这个具有更广泛的应用,不是吗?不过我有一个问题要问你,为什么在($_之前有第一个$?我到处都看到它,但我不明白它的意思。如果我试着把它拿掉,我得到的结果是一样的。 - toolshed
双引号字符串中的 $ 表示告诉 PowerShell 解释后面的内容作为变量或表达式。在括号内包含的字符串中返回属性之前,需要使用此符号。 - JNK
当我使用“ls | % {ren $ _ $ ($ _. name”开始我的命令时,为什么它可以正常工作而没有$字符?如果我没有那个第一个$字符串,会返回什么?我认为重命名命令正在获取变量$ 中包含的任何内容,然后$.name将删除扩展名前面的名称,之后你可以进一步修改或匹配输出。但是我不理解它为什么可以同时使用和不使用$符号的逻辑。此外,如何添加换行符?FAQ上说这是回车和两个空格...但不起作用。=/ - toolshed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接