1

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

3 回答 3

1

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

pushd "C:\Temp\TestPath\"
dir | ? { $_.Name -like "*.exe" } | 
% { Rename-Item $_ "$($_.BaseName.split('_')[0])$($_.Extension)" }
popd

首先,这会将您的 PowerShell 正在查看的目录更改为您定义的目录 ( pushd)。然后它将获取您目录的内容,查找所有扩展名为 .exe 的对象,并在下划线处拆分文件的基本名称。popd然后将目录设置回运行此脚本之前的位置。

于 2016-05-20T16:13:51.340 回答
1

我认为这可以通过regex删除第一个下划线和文件扩展名之间的所有内容来进一步简化:

$Path= 'C:\Temp\TestPath\'
Get-ChildItem $Path -Filter "*_*.exe" | foreach {
    $_ | Rename-Item -NewName ($_.Name -replace '(?=_).+(?=\.)')
}

当文件名不包含下划线时,这也有效。

这里是正则表达式演示

于 2016-05-20T16:33:41.363 回答
0

!未测试

尝试这个

$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
}
于 2016-05-20T16:03:22.143 回答