enrixk
Goto Top

Mit Copy-Item Verzeichnisse kopieren

Hallo,

ich verwende die folgende Powershell-Anweisung, um 5 Verzeichnisse von C:\Program Files\Microsoft VS Code\ext (im Code-Ausschnitt mit $source bezeichnet) in das servergespeicherte Heimatverzeichnis H:\Visual Studio Code\ext ($dest) zu kopieren. Weil die zu kopierenden Verzeichnisse Unterverzeichnisse enthalten, die ebenfalls Unterverzeichnisse enthalten, verwende ich den Parameter -Recurse.


Copy-Item -Path $source -Recurse  -Destination $dest -Force

Ich bekomme daraufhin folgende Fehlermeldung:

Copy-Item : Die Zieldatei "H:\Visual Studio Code\ext\ms-dotnettools.csharp-1.23.16\.debugger\pt-BR" ist keine Datei,  
sondern ein Verzeichnis.
In C:\Program Files\Microsoft VS Code\script\run.ps1:31 Zeichen:4
+             Copy-Item -Path $source -Recurse -Destination $dest ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (Microsoft.CodeA...r.resources.dll:FileInfo) [Copy-Item], IOException
    + FullyQualifiedErrorId : CopyDirectoryInfoItemIOError,Microsoft.PowerShell.Commands.CopyItemCommand

Kann sich jemand erklären warum hierbei ein WriteError auftritt?

Content-Key: 1567861682

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

Printed on: April 26, 2024 at 04:04 o'clock

Member: Doskias
Doskias Nov 29, 2021 at 14:58:36 (UTC)
Goto Top
Moin,

an sich ist dein Copy-Befehl richtig und funktioniert so auch. Auch mit Unterordner. Ich habe eher die Vermutung, dass du bei der Deklaration deiner Variablen $source und $dest ein Fehler eingeschlichen hast, aber (wieso auch immer) enthältst du uns den Teil vor. Fast so als Würde man in die Werkstatt gehen und sagen, dass der Motor komische Geräusche macht und der Mechaniker möge es sich einmal anschauen, und draußen steht dann ein Fahrrad. Was ich meine: warum postest du nicht alles sondern nur den Teil?

Zu deinen Fragen aus dem anderen Topic ():
Pfade sind zu lang
Speicherplatz auf H:\ ist zu wenig
Wenn das der Fall ist, so würdest du eigentlich eine andere Meldung erhalten.

Gruß
Doskias
Member: Enrixk
Enrixk Nov 29, 2021 updated at 15:25:21 (UTC)
Goto Top
Das mit dem zweiten Beitrag war keine Absicht. Ich kann mir nicht erklären, warum es dazu gekommen ist. Ich habe nur auf aktualisieren geklickt. Vielleicht kann man den löschen?

Gern poste ich auch den gesamten Quelltext. Die Methode installExtensions verursacht den Fehler. Der Fehler erscheint in der Powershell ungefähr 40 Mal hintereinander, immer bezogen auf ein anderes Verzeichnis. Seltsamerweise wird die Erweiterung jmrog.vscode-nuget-package-manager-1.1.6 gar nicht mehr kopiert.

class VSCodeSetup{

	[string] $WorkingDir="H:\Visual Studio Code"  
	[string] $extensionsSourceDir
	[string] $extensionsUserdir
	[string] $userDataDir
		

	VSCodeSetup([string]$extensionsSourceDir,[string]$extensionsUserdir,[string]$userdatadir){
		$this.extensionsSourceDir=$extensionsSourceDir
		$this.extensionsUserdir=$extensionsUserdir
		$this.userDataDir=$userDataDir

		If(!(test-path -Path $this.WorkingDir)){
      		New-Item -ItemType Directory -Force -Path $this.WorkingDir
			New-Item -ItemType Directory -Force -Path $this.extensionsUserdir
	  		New-Item -ItemType Directory -Force -Path $this.userDataDir
		}	
	}

	[void] installExtensions(){
		$dotnettools="H:\Visual Studio Code\ext\ms-dotnettools.csharp-1.23.16"  
		$coderunner="H:\Visual Studio Code\ext\formulahendry.code-runner-0.11.6"  
		$xmlcomments="H:\Visual Studio Code\ext\k--kato.docomment-0.1.30"  
		$mysqlclient="H:\Visual Studio Code\ext\formulahendry.vscode-mysql-0.4.1"  
		$nuget="H:\Visual Studio Code\ext\jmrog.vscode-nuget-package-manager-1.1.6"  
		$github="H:\Visual Studio Code\ext\github.vscode-pull-request-github-0.32.0"  
		$source=Join-Path -Path $this.extensionsSourceDir -ChildPath "ms-dotnettools.csharp-1.23.16"  
		if(!(Test-Path $dotnettools)){
			Copy-Item -Path $source -Destination $this.extensionsUserdir -Recurse -Force
		}
		$source=Join-Path -Path $this.extensionsSourceDir -ChildPath "formulahendry.code-runner-0.11.6"  
		if(!(Test-Path $coderunner)){
			Copy-Item -Path $source -Destination $this.extensionsUserdir -Recurse -Force
		}
		$source=Join-Path -Path $this.extensionsSourceDir -ChildPath "k--kato.docomment-0.1.30"  
		if(!(Test-Path $xmlcomments)){
			Copy-Item -Path $source -Destination $this.extensionsUserdir -Recurse -Force
		}
		$source=Join-Path -Path $this.extensionsSourceDir -ChildPath "formulahendry.vscode-mysql-0.4.1"  
		if(!(Test-Path $mysqlclient)){
			Copy-Item -Path $source -Destination $this.extensionsUserdir -Recurse -Force
		}
		$source=Join-Path -Path $this.extensionsSourceDir -ChildPath "jmrog.vscode-nuget-package-manager-1.1.6"  
		if(!(Test-Path $nuget)){
			Copy-Item -Path $source -Destination $this.extensionsUserdir -Recurse -Force
		}
		$source=Join-Path -Path $this.extensionsSourceDir -ChildPath "github.vscode-pull-request-github-0.32.0"  
		if(!(Test-Path $github)){
			Copy-Item -Path $source -Destination $this.extensionsUserdir -Recurse -Force
		}
	}

	[void] startVSCode(){
		$this.installExtensions()
		$extensionsUserDirArg=$this.extensionsUserdir
		$userDataDirArg=$this.userDataDir
		$arguments=@("--extensions-dir=`"$extensionsUserDirArg`"","--user-data-dir=`"$userDataDirArg`"")  
		& "C:\Program Files\Microsoft VS Code\bin\Code" $arguments	  
	}

}
$extensionsSourcedir="C:\Program Files\Microsoft VS Code\ext"  
$extensionsUserDir="H:\Visual Studio Code\ext"  
$userDataDir="H:\Visual Studio Code\user"  

$start= [VSCodeSetup]::new($extensionsSourceDir,$extensionsUserDir,$userDataDir)
$start.startVSCode()

Copy-Item : Die Zieldatei "H:\Visual Studio Code\ext\ms-dotnettools.csharp-1.23.16\.debugger\1045" ist keine Datei,  
sondern ein Verzeichnis.
In C:\Program Files\Microsoft VS Code\script\run.ps1:31 Zeichen:4
+             Copy-Item -Path $source -Recurse -Destination $this.exten ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (vsdebugeng.impl.resources.dll:FileInfo) [Copy-Item], IOException
    + FullyQualifiedErrorId : CopyDirectoryInfoItemIOError,Microsoft.PowerShell.Commands.CopyItemCommand

Copy-Item : Die Zieldatei "H:\Visual Studio Code\ext\ms-dotnettools.csharp-1.23.16\.debugger\pt-BR" ist keine Datei,  
sondern ein Verzeichnis.
In C:\Program Files\Microsoft VS Code\script\run.ps1:31 Zeichen:4
+             Copy-Item -Path $source -Recurse -Destination $this.exten ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (Microsoft.CodeA...r.resources.dll:FileInfo) [Copy-Item], IOException
    + FullyQualifiedErrorId : CopyDirectoryInfoItemIOError,Microsoft.PowerShell.Commands.CopyItemCommand
Member: Doskias
Doskias Nov 29, 2021 at 16:07:35 (UTC)
Goto Top
So, jetzt ergibt das ganze auch Sinn face-smile

So wie es mir scheint, kommt er mit dem Join-Path nicht ganz zurecht. Die meldung sagt ja deutlich Die Zieldatei "H:\Visual Studio Code\ext\ms-dotnettools.csharp-1.23.16\.debugger\1045" ist keine Datei, sondern ein Verzeichnis.. Hast du dir mal das Ergebnis angeschaut, was dein Skript daraus macht und den Pfad einmal händisch kopiert? An sich ist das Skript nicht schlecht, aber ich persönlich finde, das 68 Zeilen für das kopieren von 5 Verzeichnissen einfach zu viel sind, vor allem weil die Pfade ja nicht wirklich dynamisch sind. Ich wäre fast geneigt einfach 5 copy-item Zeilen stumpf untereinander zu schreiben oder die Pfade wenigstens als simplen Text ohne join-path anzugeben.

Gruß
Doskias
Member: Enrixk
Enrixk Nov 29, 2021 at 16:45:10 (UTC)
Goto Top
Ich geb' dir morgen mal ne Rückmeldung. Kann es nur im Geschäft testen.
Member: Enrixk
Enrixk Dec 02, 2021 at 05:00:25 (UTC)
Goto Top
Hallo again,

ich habe die Pfade im Skript mal händisch gesetzt ohne Join-Path. Leider hatte auch das keinen Erfolg. Seltsamerweise funktioniert der Kram in meiner privaten Active-Directory-Umgebung, nicht aber im G'schäft.