使用 PowerShell 重命名或删除文件名中的字符
Rename or Remove Characters From a Filename with PowerShell
我正在尝试重命名或删除文件名的一部分。我有一个计划的工作,将更新的文件从一台服务器移动到另一台服务器。移动文件后,需要对其进行重命名。例如:Filename_01-23-AB.exe
到 Filename.exe
我想删除从“_”到“.”的所有内容。并保持分机不变。我发现下面的代码应该可以做到这一点,但我似乎无法让它工作。我走的路对吗?
## Removes the build number from the filename of "Filename_XX-XX-XX.exe" leaving the new filename to be "Filename.exe" ##
$File = -Path "C:\Temp\TestPath\"
foreach ($File in gci *.exe) {
$Fname = ($File.name).split('.')[0] ## item before the '.' ##
$Prefix = $Fname.split('_')[0] ## item before the '_' ##
$Newname = $Prefix + '.exe'
Rename-Item $file $Newname
}
!未测试
试试这个
$path = 'C:\Temp\TestPath\'
gci $path *.exe | ? basename -match '_' | % {
# if the file.txt already exists, rename it to file-1.txt and so on
$num = 1
$base = $_.basename.substring(0, $_.basename.indexof('_'))
$ext = $_.extension
$dir = $_.directory
$newname = Join-Path $dir "$base$ext"
while (Test-Path $newname) {
$newname = Join-Path $dir "$base-$num$ext"
$num++
}
# finally, rename the file
ren $_.fullname $newname
}
我已尝试简化您要执行的操作:
pushd "C:\Temp\TestPath\"
dir | ? { $_.Name -like "*.exe" } |
% { Rename-Item $_ "$($_.BaseName.split('_')[0])$($_.Extension)" }
popd
首先,这会将您的 PowerShell 查看的目录更改为您定义的目录 (pushd
)。
然后它将获取您的目录的内容,找到所有扩展名为 .exe 的对象,并在下划线处拆分文件的基本名称。 popd
然后会将目录设置回 运行 此脚本之前的位置。
我认为使用 regex
删除第一个下划线和文件扩展名之间的所有内容可以进一步简化:
$Path= 'C:\Temp\TestPath\'
Get-ChildItem $Path -Filter "*_*.exe" | foreach {
$_ | Rename-Item -NewName ($_.Name -replace '(?=_).+(?=\.)')
}
这也适用于文件名不包含下划线的情况。
这里是 regex demo.
我正在尝试重命名或删除文件名的一部分。我有一个计划的工作,将更新的文件从一台服务器移动到另一台服务器。移动文件后,需要对其进行重命名。例如:Filename_01-23-AB.exe
到 Filename.exe
我想删除从“_”到“.”的所有内容。并保持分机不变。我发现下面的代码应该可以做到这一点,但我似乎无法让它工作。我走的路对吗?
## Removes the build number from the filename of "Filename_XX-XX-XX.exe" leaving the new filename to be "Filename.exe" ##
$File = -Path "C:\Temp\TestPath\"
foreach ($File in gci *.exe) {
$Fname = ($File.name).split('.')[0] ## item before the '.' ##
$Prefix = $Fname.split('_')[0] ## item before the '_' ##
$Newname = $Prefix + '.exe'
Rename-Item $file $Newname
}
!未测试
试试这个
$path = 'C:\Temp\TestPath\'
gci $path *.exe | ? basename -match '_' | % {
# if the file.txt already exists, rename it to file-1.txt and so on
$num = 1
$base = $_.basename.substring(0, $_.basename.indexof('_'))
$ext = $_.extension
$dir = $_.directory
$newname = Join-Path $dir "$base$ext"
while (Test-Path $newname) {
$newname = Join-Path $dir "$base-$num$ext"
$num++
}
# finally, rename the file
ren $_.fullname $newname
}
我已尝试简化您要执行的操作:
pushd "C:\Temp\TestPath\"
dir | ? { $_.Name -like "*.exe" } |
% { Rename-Item $_ "$($_.BaseName.split('_')[0])$($_.Extension)" }
popd
首先,这会将您的 PowerShell 查看的目录更改为您定义的目录 (pushd
)。
然后它将获取您的目录的内容,找到所有扩展名为 .exe 的对象,并在下划线处拆分文件的基本名称。 popd
然后会将目录设置回 运行 此脚本之前的位置。
我认为使用 regex
删除第一个下划线和文件扩展名之间的所有内容可以进一步简化:
$Path= 'C:\Temp\TestPath\'
Get-ChildItem $Path -Filter "*_*.exe" | foreach {
$_ | Rename-Item -NewName ($_.Name -replace '(?=_).+(?=\.)')
}
这也适用于文件名不包含下划线的情况。
这里是 regex demo.