使用 powershell 将文件夹名称更改为 ( ) 之间的名称

使用 powershell 将文件夹名称更改为 ( ) 之间的名称

我有一个文件夹结构,所有文件夹中都有一个介于 ( ) 之间的部分。
例如“文件夹示例 (12345)”
现在我必须重命名所有名称介于 ( ) 之间的文件夹。
因此结果是文件夹“12345”

我有一个开始,然后就陷入困境。

# Root path
$RootPath = "E:\Test\"
# Rename folders 
Get-ChildItem -Path $RootPath -Filter '*()*' -Directory -Depth 0 | Rename-Item -NewName

答案1

根据 Saaru Lindestøkke 的回答,我可以确认该脚本可以正常运行。

这是对我有用的代码:

# Root path
$RootPath = "C:\Temp\"
# Rename folders 
Get-ChildItem -Path $RootPath -Filter '*(*)*' | Rename-Item -NewName { $_.Name -replace '.*\((.+?)\).*', '$1' }

我以你的例子为例,

*()*

*(*)*

否则它什么也找不到,因为它会查找 Wildcard()Wildcard,而且我还将 $RootPath 更改为“C:\TEMP”(TEMP 后面有和没有 \ 都可以使用),并且只运行了 Get-ChildItem 的一部分来查看结果。它总是会找到我创建的文件夹。

我还删除了“-Directory -Depth 0”,因为我不知道是否需要它,但它仍然应该可以工作。

答案2

此命令将重命名folder example(12345)12345

# Root path
$RootPath = "E:\Test\"
# Rename folders
Get-ChildItem -Path $RootPath -Filter '*(*)*' -Directory -Depth 0 | Rename-Item -NewName { $_.Name -replace '.*\((.+?)\).*', '$1' }

重命名命令的作用:

Get-ChildItem            Get items in the folder
    -Path $RootPath      specified in this variable.
    -Filter '*(*)*'      Only take items that match this search
    -Directory           Only take directories
    -Depth 0             Only look in the current directory level
    |                    Forward the result to the next command
    Rename-Item          Rename the incoming items
    -NewName             Specify what the new name should be
    { 
        $_.Name          Take the name of the item to be renamed
        -replace         replace that name
        '.*\((.+?)\).*', matching a regular expression
        '$1'             with the first capture group (see below for more explanation)
    }

正则表达式可以进一步解释:

.*    Match any character 0 or more times
\(    Match a literal left parenthesis
(.+?) Capture a group containing any character occurring more than once, but as few times as possible.
\)    Match a literal right parenthesis
.*    Match any character 0 or more times

可以通过引用来重复使用捕获的组$1

演示:

在此处输入图片描述

相关内容