enrixk
Goto Top

NET-Projektmappe kopieren mit Powershell

Werte Powershell-Experten,

ich stehe vor einem komplexen Problem. Ich habe das unten abgebildete Powershell Skript geschrieben, das beim Starten von Visual Studio Code eine .NET-Projektmappe von H:\vscode nach C:\Users\Benutzrname\vscode kopieren soll und beim Beenden wieder zurück. Vereinfacht kann man sagen, dass zwischen H:\vscode und C:\Users\Benutzrname\vscode nach getaner Arbeit eine Art Synchronisation stattfinden soll.

Ich habe mein Skript getestet und dabei folgendes Verhalten beobachtet:
  • Manchmal übergeht der Kopiervorgang willkürlich irgendwelche Dateien. Die .NET-Projekte sind dann unbrauchbar.
  • Trotz Fehlermeldungen legt der Kopiervorgang oft (aber nicht immer) alle Dateien vollständig ab.
  • Die Fehlermeldung "Die Zieldatei ist keine Datei, sondern ein Verzeichnis" erscheint oft aber nicht immer (Es ist allerdings nicht so, dass Dateiname und Verzeichnisname identisch sind)
  • Sporadisch taucht die Fehlermeldung "Copy-Item: Der Verzeichnisname ist ungültig" auf.
  • Manchmal wird die letzte Anweisung (Remove-Item) nicht ausgeführt.

Ihr seht, dass das Fehlverhalten sehr unregelmäßig und unspezifisch ist. Merkwürdig ist auch, dass das Kopieren der .NET-Projektmappe per Mausklick in allen getesteten Fällen problemlos verläuft.

Da das Skript mal funktioniert und mal nicht, habe ich den Suchradius etwas erweitert. Dabei ist mir aufgefallen, dass das Verzeichnis H:\ eine Ordnereinbindung ist. Physisch befindet sich das Verzeichnis auf einem entfernten Linux-Server (Entfernung 600m, Link-Geschwindigkeit max. 1Gbit/s). Alle Benutzer befinden sich außerdem in einer Activ-Directory-Domäne, die mithilfe eines Samba AD-DC bereitgestellt und über Gruppenrichtlinien etc. verwaltet wird. Das hier Samba als AD-DC und mit im Spiel ist und nicht Windows Server, muss noch nicht zwangsläufig etwas heißen. Privat arbeite ich in einer ähnlichen Umgebung ohne dass ich die oben gennnten Verhaltensweisen beobachten konnte. Ich selbst bin Domänen-Admin und habe umfangreiche Rechte. Weiter kann ich die Infrastruktur nicht erkunden, da sie von einem externen IT-Dienstleister bereitgestellt wird. Dieser hat vorerst auf das oben erwähnte Problem keine plausible Erklärung.

Meine Frage: Hat jemand mit Powershell in der oben skizzierten Arbeitsumgebung ähnliche Erfahrungen gemacht und kann ein ppar Tipps beisteuern, wie man das hin- und herkopieren der .NET-Projektmappe zuverlässiger machen könnte. Wäre es z. B. möglich das Skript so zu erweitern, dass es nach dem Kopieren noch einmal prüft, ob wirklich alle Dateien mitgekommen sind? Ich bin für alle Anregungen und Tipps dankbar!

class VSCodeSetup{
	[string] $userDataDir
	[string] $projectpath
	[string] $projectcache
	[string] $packagepath

		
	VSCodeSetup(){
		$this.userDataDir="C:\tmp\userdata"  
		$this.projectpath=$env:USERPROFILE+"\vscode"  
		$this.packagepath="C:\"  
		$this.projectcache="H:\vscode"  

		If(!(test-path -Path $this.projectcache)){
			New-Item -ItemType Directory -Path $this.projectcache -Force
			Get-Item "C:\Program Files\Microsoft VS Code\projects\*" | Copy-Item -Destination $this.projectcache -Recurse -Force  
		}	
		If(test-path -Path $this.userDataDir){
	  		Remove-Item -Path $this.userDataDir -Force -Recurse
		}	
	}
	
	[void] startVSCode(){
		$this.projectpath+="\projects"  
		WRITE-HOST $this.projectpath
		#Wenn der Projektpfad existiert ...
		If(test-path -Path $this.projectpath){
			#Lösche den Projektpfad ...
			Remove-Item -Path $this.projectpath -Force -Recurse
			#Lege den Projektpfad neu an ...
			New-Item -ItemType Directory  -Path $this.projectpath -Force
			#Kopiere den Projektcache in den neuen Projektpfad ...
			$arg=$this.projectcache+"\*"  
			Get-Item $arg | Copy-Item -Destination $this.projectpath -Recurse -Force
			#Move-Item -path $this.projectcache -Destination $this.projectpath -Force
		#Wenn der Projektpfad nicht exstiert
		}Else{
			#Lege den Projektpfad neu an ...
			New-Item -ItemType Directory  -Path $this.projectpath -Force
			#Kopiere den Projektcache in den neuen Projektpfad ...
			$arg=$this.projectcache+"\*"  
			Get-Item $arg | Copy-Item -Destination $this.projectpath -Recurse -Force
		}

		$userDataPath=$this.userDataDir
		$arguments=@("--extensions-dir=""C:\Program Files\Microsoft VS Code\ext""","--user-data-dir=""$userDataPath""", $this.projectpath)  
		& "C:\Program Files\Microsoft VS Code\Code.exe"  $arguments  
		#$this.projectpath=$env:USERPROFILE+"\vscode" 
	}
	
	[void] endVSCode(){
		while((Get-Process -Name Code -EA SilentlyContinue)){
			#hier passiert gar nichts.
		}
		#Lösche den Projektcache ...
		Remove-Item -Path $this.projectcache -Force -Recurse
		#Lege den Projectcache neu an
		New-Item -ItemType Directory -Path $this.projectcache -Force
		#Kopiere den Projektpfad in den Projektcache ...
		$arg=$this.projectpath+"\*"  
		Get-Item $arg | Copy-Item -Destination $this.projectcache -Recurse -Force
		#Lösche den Projektpfad ...
		Remove-Item -Path $this.projectpath -Force -Recurse

	}
}
$start= [VSCodeSetup]::new()
$start.startVSCode()
$start.endVSCode()

Content-ID: 2338596813

Url: https://administrator.de/contentid/2338596813

Ausgedruckt am: 22.11.2024 um 09:11 Uhr

1915348599
Lösung 1915348599 30.03.2022 aktualisiert um 09:47:59 Uhr
Goto Top
Wieso jetzt schon wieder ein Doppelpost? Geht's mal wieder nicht schnell genug? 👎

Synchronisieren? Dann nimm mal Robocopy...
Ich selbst bin Domänen-Admin und habe umfangreiche Rechte.
Mit Domain Admin Credentials an nem Client hantieren?? Bist du des Wahnsinns ...
Enrixk
Enrixk 30.03.2022 um 13:26:25 Uhr
Goto Top
robocopy hats gebracht. Mich würde natürlich brennend interessieren, warum Copy-Item für diesen Zweck nicht funktioniert hat.
1915348599
1915348599 30.03.2022 aktualisiert um 15:46:52 Uhr
Goto Top
Mich würde natürlich brennend interessieren, warum Copy-Item für diesen Zweck nicht funktioniert hat.
Kann ich nicht nachvollziehen, lüppt hier einwandfrei ... muss was an deiner Methode etwas nicht ganz stimmen ist aber nicht fürs Synchronisieren gedacht dafür gibt es wie gesagt bessere Tools außer man macht es manuell auf dem Fuße mit eigenen Hash-Vergleichen.