使用 powershell 重命名多个工作表和多个文件

Rename multiple worksheet and multiple files with powershell

抱歉我的英语不好我是法国人。

我是 Powershell 的新手,我想重命名多个文件中的所有工作表。 到目前为止,我得到了重命名目录中所有文件的代码

    Function Rename()
{
$path = Get-Location
$files = Get-ChildItem
$counter = 1

foreach($file in $files)
    {
       Rename-Item $file.FullName "$counter" + ".xlsx"
       $counter++
    }
}

然后我尝试在一个特定文件上重命名其中的所有工作表,但它不起作用。当它有 4 个工作表时,循环只工作一次。

Function RenameTab ($ExcelFileName)
{
#Emplacement du fichier
$excelFile = "C:\Users\Donosaure\Documents\Magister\" + $excelFileName + ".xlsx"

#Ouverture d'excel
$xldoc =  New-Object -ComObject "Excel.Application"

#Message de confirmation
$xldoc.Visible = $false
$xldoc.DisplayAlerts = $false

#Ouverture du fichier
$workbook = $xldoc.Workbooks.Open($excelFile)
$inc = 1
$i=1
foreach ($worksheet in $workbook.Worksheets.count)
{
    $worksheet = $workbook.Sheets.Item($i)
    $worksheet.Name = $inc
    $inc++
    $i++

    $workbook.SaveAs("C:\Users\Donosaure\Documents\Magister.xlsx")
    $workbook.Close()
}
$xldoc.Quit()
}

RenameTab("Magister")

有人可以帮我吗?

感谢您的宝贵时间

关于您的代码的几点说明:

  • 在 PowerShell 中发送到函数的参数由 space 分隔,您不应像 RenameTab("Magister")
  • 那样在它们周围使用方括号
  • 使用 COM 对象时,请始终确保在完成后将它们从内存中释放,否则它们将在内存中徘徊,如果您 运行 一次又一次,您将 运行 资源不足否则
  • 请检查 Excel Worksheets Naming Convention,以免创建包含无效字符的工作表名称。目前情况并非如此,但你永远不知道它是如何演变的。
  • 请为您创建的函数使用 PowerShell 函数 'Verb-Noun' 命名约定。

下面应该做你想做的:

Function Rename-ExcelTabs ($ExcelFileName) {
    #Emplacement du fichier
    $excelFile = "C:\Users\Donosaure\Documents\Magister\" + $excelFileName + ".xlsx"

    #Ouverture d'excel
    $xldoc =  New-Object -ComObject "Excel.Application"

    #Message de confirmation
    $xldoc.Visible = $false
    $xldoc.DisplayAlerts = $false

    #Ouverture du fichier
    $workbook = $xldoc.Workbooks.Open($excelFile)
    for ($i = 1; $i -le $workbook.Worksheets.Count; $i++) {
        $workbook.Sheets.Item($i).Name = $i
    }
    $workbook.SaveAs("C:\Users\Donosaure\Documents\Magister\" + $excelFileName + "_1.xlsx")
    $workbook.Close()
    $xldoc.Quit()

    # clean-up used COM objects
    $null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook)
    $null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($xldoc)
    [System.GC]::Collect()
    [System.GC]::WaitForPendingFinalizers()
}

Rename-ExcelTabs "Magister"

根据您的评论,该函数可以重写,不仅可以更改一个 Excel 文件中的选项卡名称,还可以处理一个文件夹中的所有 .xlsx 文件并重命名这些文件。

一种方法是在重命名选项卡并使用 $workbook.SaveAs() 创建新文件后删除原始文件,如上面的代码所示。

以下函数通过先重命名文件然后更改其中的选项卡名称来完成此操作。

function Rename-ExcelTabsAndFiles {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [ValidateScript({Test-Path -Path $_ -PathType Container})]
        [Alias('Path')]
        [string]$SourceFolder
    )
    # get a list of xlsx files
    $allFiles = Get-ChildItem -Path $SourceFolder -Filter '*.xlsx' -File

    # create an Excel object
    $xldoc = New-Object -ComObject Excel.Application

    # Message de confirmation
    $xldoc.Visible = $false
    $xldoc.DisplayAlerts = $false

    $fileCount = 1
    foreach ($excelFile in $allFiles) {
        # rename the file. use -PassThru to get the FileInfo object of the renamed file
        # apparently you want the files to be called '1.xlsx', '2.xlsx' etc.
        $newName = '{0}.xlsx' -f $fileCount++
        Write-Host "Renaming file '$($excelFile.Name)' to '$newName'"
        $excelFile = Rename-Item -Path $excelFile.FullName -NewName $newName -PassThru

        # Ouverture du fichier
        $workbook = $xldoc.Workbooks.Open($excelFile.FullName)
        # rename all worksheets in the file
        Write-Host "Renaming all worksheets in '$newName'"
        for ($i = 1; $i -le $workbook.Worksheets.Count; $i++) {
            $workbook.Sheets.Item($i).Name = $i
        }
        $workbook.Save()
        $workbook.Close()
    }

    $xldoc.Quit()

    # clean-up used COM objects
    $null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook)
    $null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($xldoc)
    [System.GC]::Collect()
    [System.GC]::WaitForPendingFinalizers()
}

Rename-ExcelTabsAndFiles "C:\Users\Donosaure\Documents\Magister"