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