Сценарий Powershell для замены нескольких файлов PDF в библиотеке документов новыми именами

#powershell #sharepoint

#powershell #sharepoint

Вопрос:

У меня есть несколько файлов в папке библиотеки документов «Документы», которые необходимо заменить новыми именами. Пример: hello123.pdf необходимо заменить на hello789.pdf ниже приведен пример, который я пробовал с filename_old с существующими именами файлов и filenames_new с новым набором имен.Как мне зациклить оба приведенных ниже примера

 $Web = Get-SPWeb "https://test.com"
$DocLib = $Web.Lists["Documents"]           
$filename_old  = Get-Content 'F:usertest1.txt' | old file names
$filename_new  = Get-Content 'F:usertest2.txt' | new file names
$outputFile = 'F:usersRenameResults.csv'

# loop through each item of the text file
$result = foreach($name in $filenames) {
    # try and find a listitem name that has the $name in it
    $renamed = foreach ($ListItem in ($DocLib.Items | Where-Object { $_["Name"] -like "*$name*" })) {
        $oldName = $ListItem["Name"]
        $newName = $name 
        $ListItem.File.CheckOut()
        $ListItem["Name"] = $newName
        $ListItem.Update()
        $ListItem.File.CheckIn($ListItem["Name"]   ".pdf")
        [PsCustomObject]@{
            SearchName      = $name
            OldListItemName = $oldName
            NewListItemName = $newName
        }
    }
    
    if (!$renamed) {
        [PsCustomObject]@{
            SearchName      = $name
            OldListItemName = 'Not found'
            NewListItemName = ''
        }        
    }
    else { $renamed }
}

# output to CSV file
$result | Export-Csv -Path $outputFile -UseCulture -NoTypeInformation
 

Комментарии:

1. foreach($name in $filenames) .. вы еще не определили $filenames

2. Я думаю, было бы проще создать входной CSV-файл, содержащий старые и новые имена, если они не могут быть вычислены, вместо двух отдельных списков. Являются ли эти комментарии за | строками 2 и 3? В Powershell вы делаете это с # помощью … Что сказал @Theo.

Ответ №1:

Я не предлагаю вам использовать foreach , потому что тогда вы можете использовать только Where-Object {$_["Name"] -like "*$name*"} для получения listitem , который появится, когда в задаче библиотеки будет несколько файлов с похожими именами.

Мой тестовый код для вашей справки (но этот метод должен поддерживать согласованный порядок в двух текстах):

  $filename_old  = Get-Content 'C:Temptest1.txt' 
    $filename_new  = Get-Content 'C:Temptest2.txt'
    $outputFile = 'C:TempRenameResults.csv'
    $Web = Get-SPWeb "http://sp"
    $DocLib = $Web.Lists["Documents"] 
    $listItemData=@()
    for($i=0;$i -lt $filename_old.Count;$i  ){
    
        # try and find a listitem name that has the $name in it
        $renamed = foreach ($ListItem in ($DocLib.Items | Where-Object { $_["Name"] -eq $filename_old[$i] })) {
            $oldName = $ListItem["Name"]
            $newName = $filename_new[$i] 
            $ListItem.File.CheckOut()
            $ListItem["Name"] = $newName
            $ListItem.Update()
            $ListItem.File.CheckIn($ListItem["Name"]   ".pdf")
            $listItemData  = New-Object PSObject -Property @{
                SearchName      = $name
                OldListItemName = $oldName
                NewListItemName = $newName
            }
            
        }
        
        if (!$renamed) {
            $listItemData  = New-Object PSObject -Property @{
                SearchName      = $name
                OldListItemName = 'Not found'
                NewListItemName = ''
            }        
        }
        else { $renamed }
    }
    $listItemData | Export-Csv -Path $outputFile -UseCulture -NoTypeInformation