Dieses Mal ist die Anforderung, täglich mittels PowerShell Dateien aus einem FileShare zu laden. Diese Dateien werden danach zu einer Zip-Datei zusammengefasst und in einer SharePoint Bibliothek abgelegt.
Daher muss man zuerst die Anmeldedaten des Benutzers eingeben, um auf den FileShare zugreifen zu können.

$userName = "Stefan"
$domain = "Smarter"
$password = convertto-securestring "password" -AsPlainText -Force
$user = $domain + "\" + $userName)
$cred = new-object -typename System.Management.Automation.PSCredential ($user, $password)

Mit FileShare verbinden und Dateien herunterladen

Mittels dem New-PSDrive Befehl, wird nun ein temporäres Laufwerk erstellt, welches einem Dateipfad zugeordnet ist. Das Argument „Name“ entspricht dem Laufwerks-Buchstaben. Als „PSProvider“ wähle ich „filesystem“ und „Root“ ist der Pfad, auf den das Netzlaufwerk gemappt wird. Das letzte Argument ist das PSCredentials Objekt, welches ich zuvor erstellt habe.

$rootPath = "\\computername\smarterFileSystem"
If (!(Test-Path Y:))
{
	New-PSDrive -Name Y -PSProvider filesystem -Root $rootPath -Credential $cred 
}

Hier kann es zu folgendem Fehler kommen:

New-PSDrive : Multiple connections to a server or shared resource by the same user, using more than one user name, are not allowed. Disconnect all previous connections to the server or shared resource and try
again

Ist dies der Fall, muss man folgendermaßen vorgehen:

  1. Durch den Befehl net use alle aktuell verwendeten Verbindungen angezeigen.
  2. Diese werden dann mit dem Befehl net use /delete \\computername\smarterFileSystem entfernt.

Wurde der Fehler dadurch nicht behoben, kann der Zugriff ebenfalls über die IP-Adresse anstatt des Computernamens erfolgen (siehe Microsoft fix). Ist die IP-Adresse nicht bekannt, kann diese folgendermaßen ausgelesen werden.

$ip = [System.Net.Dns]::GetHostByName("computername").AddressList.IPAddressToString
$rootPath = "\\" + $ip + "\smarterFileSystem"

Als Nächstes, speichert man die Dateien vom FileShare lokal zwischen. Dazu nutzt man der Befehl Copy-Item. Als erstem Parameter wird der Pfad zur Datei über das Netzlaufwerk angegeben. Als „Destination“ wird der Pfad angegeben, an dem die Datei zwischengespeichert soll.

$filePath = "Y:" + PathToTheFile
$tempPath = "C:\temp\SmarterFiles\"
Copy-Item $filePath -Destination $tempPath

Zip-Datei erstellen

Sobald alle benötigten Dateien vorhanden sind, fasst man diese zu einer Zip-Datei zusammen. Dazu muss man folgende Dll einbinden.

Add-Type -Assembly System.IO.Compression.FileSystem

Danach erstellt man die Zip-Datei durch CreateFromDirectory.

$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
[System.IO.Compression.ZipFile]::CreateFromDirectory($tempPath, ($tempPath + ".zip"), $compressionLevel, $false)
Write-Host Zip-File successfully created

Zip-Datei in SharePoint Bibliothek hochladen

Nach dem Zip-Vorgang lädt man diese Datei nun in eine SharePoint Bibliothek hoch.

$filePath = $outPath + ".zip"
$file = Get-ChildItem $filePath
$fileName = $filePath.Substring($filePath.LastIndexOf("\") + 1)

$webUrl = https://SmarterSharePoint.at/
$listName = "SmarterFileBib"

$web = Get-SPWeb $webUrl
$dataList = $web.Lists[$listName]
$dataList.RootFolder.Files.Add($fileName, $file.OpenRead(), $false)

Aufräumen

Zum Schluss entfernt man nur noch das temporäre Laufwerk und die Dateien inkl. der Zip-Datei wieder, welche lokal zwischengespeichert wurden.

If (Test-Path Y:)
{
	Remove-PSDrive Y
}

Remove-Item $tempPath -Force -Recurse

Ich hoffe ich konnte euch weiterhelfen damit, eine Zip-Datei mittels Powershell zu erstellen. Fragen bitte in die Kommentare oder direkt per Mail an mich.
Lg Stefan