#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