SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Wie Listenelemente per PowerShell umbenennen?

Geprüfte Antwort Dieser Beitrag hat 13 Antworten

Ohne Rang
70 Beiträge
Jan Er erstellt 15 Jan. 2014 15:36
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo,

wir haben hier eine Bibliothek in der eine größere Anzahl Elemente umbenannt werden soll.

 

In der Bibliothek befindet sich ein Ordner, darin enthalten ca. 3000 Dokumentenmappen. Die Mappen haben als Spalten Name, Spalte1, Spalte2. Der Name soll jetzt in "Spalte1_Spalte2" abgeändert werden. Kann mir da jemand helfen? Rudimentäre PowerShell-Kenntnisse sind vorhanen, pipen klappt auch, weiß nur nicht ganz wie ich anfangen soll/muss :)

Seite in Variable holen, gleiches mit der Bibliothek - und dann?

 

Danke schonmal vorab!

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 16 Jan. 2014 08:16
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

$web = Get-SPWeb "http://sharepoint/sites/site1"
$lib = $web.Lists["NameDerBibliothek"]
$items = $lib.Items
foreach ($item in $items) {
$item["Name"] = $item["Spalte1"] + "_" + $item["Spalte2"]
$item.Update()
}

Das ist die grobe Struktur. Sollte man vielleicht noch um die eine oder andere Prüfung erweitern, z.B. um festzustellen, ob in den Feldern wirklich ein Wert steht. Und ob es sich wirklich um eine Dokumentenmappe handelt.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
70 Beiträge
Jan Er Als Antwort am 17 Jan. 2014 09:39
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke dir, werde das noch an Testdaten "verfeinern" (Prüfung usw.) und dann geht's los! :)

Ohne Rang
70 Beiträge
Jan Er Als Antwort am 20 Jan. 2014 14:25
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Andi,

soweit klappt das ganze, allerdings brauche ich noch einmal deine Hilfe, ich dachte ich google mir mal schnell den Rest zusammen, hat leider nicht geklappt :-(

Das ganze soll ja nur in einem bestimmten Unter-Unter-Ordner stattfinden, wie komme ich an den Ordner bzw. die Elemente darin? Im Root funktiert das gut, hier mal das Skript wie es nun ist:

$web = Get-SPWeb "http://seite"
$lib = $web.Lists["Bibliothek"]
$items = $lib.Items
$count = 0
$countbad = 0


foreach ($item in $items)
 {
 if ($item["Spalte1"] -ne $null)
  {
  if ($item["Spalte2"] -ne $null)
  {
  $item["Name"] = $item["Spalte1"] + "_" + $item["Spalte2"]
  Write-Host "Umbenennen von "$item.Name"..."
  $item.Update()
  $count++
  }
  else{
  $countbad++
  }
  }
 else{
  $countbad++
 }
 }

Write-Host "Umbenennen von "$count" Objekten erfolgreich abgeschlossen!" -foregroundcolor Green
Write-Host ""$countbad" Objekt(e) nicht umbenannt." -foregroundcolor red

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 20 Jan. 2014 14:57
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das ist nicht mehr ganz so einfach. Entweder Du läßt den Code wie er ist und prüfst bei jedem Element, ob es in einem bestimmten Pfad ist:

if ($item["FileRef"].Contains("/folder/subfolder/"))

Oder Du verwendest die "richtige" Methode und lädst auch nur die Elemente, die Du wirklich möchtest. Dazu verwendet man ein SPQuery-Objekt und setzt es auf einen bestimmten SPFolder an:

$folder = $web.GetFolder($web.Url + "/library/folder/subfolder")
$query = New-Object [Microsoft.SharePoint.SPQuery]
$query.Folder = $folder
$items = $lib.GetItems($query)

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
70 Beiträge
Jan Er Als Antwort am 20 Jan. 2014 15:33
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Im Sinne der Performance ist die "richtige Methode" wohl die besser Wahl, das klappt auch gut, danke! :)

Allerdings habe ich gerade ein neues "Problem" entdeckt. Ich habe ja drei Spalten, Name, Spalte1, Spalte2. Ich lasse das Skript laufen, der Name wird basierend auf Spalte1 und 2 neu aufgebaut und auf den ersten Blick sieht alles gut aus, die Informationen in Spalte 1 und 2 stehen weiterhin in der Bibliothek. Bearbeite ich jetzt die Eigenschaften einer Dokumentenmappe stehen in den Eigenschaften die Werte für Spalte1 und 2 nicht mehr drin. Auch wenn ich neue Werte eintrage werden diese nicht übernommen?! Bei "normalen" Dokumenten tritt das Verhalten nicht auf.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 20 Jan. 2014 15:49
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das hört sich aber sehr seltsam an. Macht Dein Script vielleicht noch ein paar andere Dinge? Verhalten sich neu angelegte Dokumentenmappen in diesem Ordner genauso? Oder wurde einfach nur das Formular, das die Eigenschaften anzeigt, verbogen? Wie verhält es sich, wenn die Spalten per Inline-Edit direkt in der Ansicht bearbeitet werden?

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
70 Beiträge
Jan Er Als Antwort am 20 Jan. 2014 16:09
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Nein, das Skript ist nur das was ich oben gepostet habe und nun um die Query mit den Foldern erweitert habe.

Ich arbeite gerade nicht im produktiven System sondern auf einer neuen Testseite, daher sind alle Mappen oder anderen Dokumente neue Daten. Mal folgendes Beispiel:

Name               Spalte1           Spalte2
Mappe1            12345             HalloWelt

Ich lasse das Skript laufen, dann sieht es wie folgt aus:

Name                                Spalte1           Spalte2
12345_HalloWelt            12345             HalloWelt

Im Formular das die Eigenschaften anzeigt steht der abgeänderte Name drin, die Felder für Spalte1 und 2 sind leer.

Bearbeite ich den Datensatz per Inline-Bearbeitung, zb. das Spalte1 den Wert 6789 zugewiesen bekommt, wird das in der Bibliothek so angezeigt, öffne ich allerdings den Eigenschaften-Dialog ist das Feld weiterhin leer?!

 

Dieses Verhalten bezieht sich aber nur auf Dokumentenmappen! Ändere ich zB eine einfache Textdatei in der Bibliothek werden alle Werte korrekt übernommen.

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 20 Jan. 2014 16:42
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Jan Er"]Bearbeite ich den Datensatz per Inline-Bearbeitung, zb. das Spalte1 den Wert 6789 zugewiesen bekommt, wird das in der Bibliothek so angezeigt, öffne ich allerdings den Eigenschaften-Dialog ist das Feld weiterhin leer?![/quote]

Das riecht eigentlich danach, daß das Formular "angepaßt" wurde. Die Daten werden ja offenbar korrekt gespeichert und in der Ansicht auch korrekt angezeigt. Und sie lassen sich per inline-Edit korrekt bearbeiten.

Gehören denn die Spalten auch zum Inhaltstyp der Dokumentenmappen?

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
70 Beiträge
Jan Er Als Antwort am 20 Jan. 2014 17:18
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ja, hab den Inhaltstypen extra für den Test neu angelegt. Das Formular wurde meines Wissens nach nicht angepasst.

Ich bin gerade aus dem Büro raus, teste das ganze morgen noch einmal mit frischer Bibliothek und melde mich dann!

Ohne Rang
70 Beiträge
Jan Er Als Antwort am 21 Jan. 2014 11:55
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Klappt jetzt, irgendwas war wohl mit der Bibliothek falsch. Danke nochmal! :-)

Ohne Rang
70 Beiträge
Jan Er Als Antwort am 24 Jan. 2014 07:34
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich nochmal :-)

Das ganze klappte so gut das ich es noch mit einer anderen Bibliothek durchführen wollte, diese enthält allerdings Spalten mit ManagedMetadata. Wie komme ich denn an deren Inhalte als String umd ihn in Spalte1 schreiben zu können?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 24 Jan. 2014 09:39
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Bei den Managed Metadata Feldern ist das nicht mehr ganz so einfach. Man kann sich aber den Wert von SPField.GetFieldValueAsText() so formatieren lassen, wie er innerhalb von SharePoint angezeigt wird.

Hole Dir dazu die Spalte von der Liste und lasse sie den Wert formatieren:

$field = $list.Fields["Spaltenname"]
$value = $item["Spaltenname"]
$stringValue = $field.GetFieldValueAsText($value)

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
70 Beiträge
Jan Er Als Antwort am 24 Jan. 2014 10:15
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Läuft! Danke dir, malwieder :-)