BpDk 0 Geschrieben 27. Februar 2018 Melden Teilen Geschrieben 27. Februar 2018 (bearbeitet) Hallo Leute, ich habe mir ein kleines Skript mit Powershell erstellt, das mir eine VHDX + VM mit ein paar Grundeinstellungen erstellt und einbindet. Wie ihr seht. definiere ich oben verschiedene Variablen mit "Read-Host" für eine Benutzereingabe. Nun habe ich folgendes Problem: Die Variablen "$Vhdsize" und "$Memorysize" kann nicht weiterverarbeitet werden -->Folgende Meldung: Zitat New-VHD : Cannot bind parameter 'SizeBytes'. Cannot convert value "2GB" to type "System.UInt64". Error: "Input string was not in a correct format." At D:\VM.ps1:10 char:53 + New-VHD -Path $VMDir\$VMName.vhdx -Fixed -SizeBytes $Vhdsize + ~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [New-VHD], ParameterBindingException + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.Vhd.PowerShell.Cmdlets.NewVhd Wie muss ich meine Variablen deklarien, dass diese verarbeitet werden können? Hier mein Skript: [string]$HostName = "WS037" [string]$VMName = Read-Host "VMName" [string]$VMDir = Read-Host "VHDX Verzeichnis" [string]$Vhdsize = Read-Host "VHH Größe" [string]$Memorysize = Read-Host "Arbeitsspeicher" [string]$NumbervCPU = Read-Host "Anzahl vCPU" New-VHD -Path $VMDir\$VMName.vhdx -Fixed -SizeBytes $Vhdsize New-VM -Name $VMName -MemoryStartupBytes $Memorysize -Generation 2 -VHDPath $VMDir\$VMName.vhdx -ComputerName $HostName -SwitchName VSwitch Set-VMProcessor -VMName $VMName -ComputerName $HostName -Count $NumbervCPU Get-VM –VMname $VMName | Set-VM -AutomaticStopAction ShutDown Get-VM –VMname $VMName | Set-VMMemory -DynamicMemoryEnabled $false Ich bin absoluter Powershell-Neuling. Gerne Verbesserungsvorschläge. Liebe Grüße und Danke, BpDk bearbeitet 27. Februar 2018 von BpDk Zitieren Link zu diesem Kommentar
zahni 554 Geschrieben 27. Februar 2018 Melden Teilen Geschrieben 27. Februar 2018 (bearbeitet) z.B. mal hier lesen: https://stackoverflow.com/questions/18606616/converting-input-variable-to-uint64 bearbeitet 27. Februar 2018 von zahni 1 Zitieren Link zu diesem Kommentar
BpDk 0 Geschrieben 27. Februar 2018 Autor Melden Teilen Geschrieben 27. Februar 2018 vor 1 Stunde schrieb zahni: z.B. mal hier lesen: https://stackoverflow.com/questions/18606616/converting-input-variable-to-uint64 Hallo Zahni, ich habe die Möglichkeit aus dem Artikel versucht anzuwenden, jedoch ohne Erfolg. Kannst du mir auf die Sprünge helfen? Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 28. Februar 2018 Melden Teilen Geschrieben 28. Februar 2018 Der zu übergebende Wert ist nicht "2GB" sondern "2147483648". Ich würde empfehlen, einfach nur die reine "Zahl" abzufragen - also ohne die Einheit GB und dann vor dem Aufruf des cmdlets einfach in Byte umzurechnen. Zitieren Link zu diesem Kommentar
zahni 554 Geschrieben 28. Februar 2018 Melden Teilen Geschrieben 28. Februar 2018 Geht doch: PS S:\> [uint64]$var1 = 3GB PS S:\> $var1 3221225472 PS S:\> Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 28. Februar 2018 Melden Teilen Geschrieben 28. Februar 2018 Klar - dann musst Du aber eben die zu übergebende Variable explizit nach [Uint64] casten. Und je nach dem, wer den Wert eingibt, muss er oder sie wissen, wie man den Wert eingibt. "3 GB" wäre zum Beispiel falsch - es muss wirklich "3GB" sein. Vielleicht könnte man auch eine Vorauswahl von möglichen (sinnvollen) Werten präsentieren und man wählt eine davon aus. Das würde Fehleingaben noch besser ausschließen. Zitieren Link zu diesem Kommentar
Dukel 454 Geschrieben 28. Februar 2018 Melden Teilen Geschrieben 28. Februar 2018 Oder verschiedene Klassen an Systemen (Gold, Silber, Bronze) mit entsprechenden Werten. Zitieren Link zu diesem Kommentar
Beste Lösung testperson 1.677 Geschrieben 28. Februar 2018 Beste Lösung Melden Teilen Geschrieben 28. Februar 2018 Hatte ein wenig Langeweile [string]$var1 = "1GB" do { [string]$var1 = Read-Host "Größe" if ($var1.Length -le 1) { [string]$var1 = $var1 + "GB" } if (($var1.SubString($var1.Length-2)) -ne "GB") { [string]$var1 = $var1 + "GB" } } while (($var1.SubString($var1.Length-2)) -ne "GB" -or ($var1.SubString(0,$var1.Length-2)) -notmatch "^[0-9]+$") [uint64]$var2 = ($var1 / [uint64]1) Write-Host $var1 in uint64: $var2 Zitieren Link zu diesem Kommentar
Dukel 454 Geschrieben 28. Februar 2018 Melden Teilen Geschrieben 28. Februar 2018 Funktioniert aber nur mit GB. Nicht mit TB oder MB,... Wieso die Do-While Schleife? Zitieren Link zu diesem Kommentar
testperson 1.677 Geschrieben 28. Februar 2018 Melden Teilen Geschrieben 28. Februar 2018 Joa, das es perfekt ist, hat niemand behauptet. Do-While, damit bei falscher Eingabe "geloopt" wird, bis was passendes eingegeben wurde. Zitieren Link zu diesem Kommentar
Dukel 454 Geschrieben 28. Februar 2018 Melden Teilen Geschrieben 28. Februar 2018 Ich würde nur ein Format zulassen (z.B. Angaben in GB). Das ist sicher das einfachste für diesen Zweck. Zitieren Link zu diesem Kommentar
BpDk 0 Geschrieben 28. Februar 2018 Autor Melden Teilen Geschrieben 28. Februar 2018 Hallo Leute, vielen Dank für eure Unterstützung. Ich habe es umgesetzt bekommen! Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.