使用PowerShell重命名或删除文件名中的字符

我正在尝试重命名或删除部分文件名。 我有一个计划的工作,将更新的文件从一台服务器移动到另一台服务器。 一旦文件被移动,它需要被重命名。 例如: Filename_01-23-AB.exeFilename.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 } 

我尝试过简化你想要做的事情:

 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 '(?=_).+(?=\.)') } 

这也适用于文件名不包含下划线的情况。

在这里正则表达式演示 。

!没有测试

尝试这个

 $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 }