BpDk 0 Geschrieben 27. Februar 2018 Melden 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
zahni 566 Geschrieben 27. Februar 2018 Melden 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
BpDk 0 Geschrieben 27. Februar 2018 Autor Melden 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
BOfH_666 583 Geschrieben 28. Februar 2018 Melden 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
zahni 566 Geschrieben 28. Februar 2018 Melden Geschrieben 28. Februar 2018 Geht doch: PS S:\> [uint64]$var1 = 3GB PS S:\> $var1 3221225472 PS S:\> Zitieren
BOfH_666 583 Geschrieben 28. Februar 2018 Melden 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
Dukel 460 Geschrieben 28. Februar 2018 Melden Geschrieben 28. Februar 2018 Oder verschiedene Klassen an Systemen (Gold, Silber, Bronze) mit entsprechenden Werten. Zitieren
Beste Lösung testperson 1.758 Geschrieben 28. Februar 2018 Beste Lösung Melden 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
Dukel 460 Geschrieben 28. Februar 2018 Melden Geschrieben 28. Februar 2018 Funktioniert aber nur mit GB. Nicht mit TB oder MB,... Wieso die Do-While Schleife? Zitieren
testperson 1.758 Geschrieben 28. Februar 2018 Melden 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
Dukel 460 Geschrieben 28. Februar 2018 Melden 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
BpDk 0 Geschrieben 28. Februar 2018 Autor Melden Geschrieben 28. Februar 2018 Hallo Leute, vielen Dank für eure Unterstützung. Ich habe es umgesetzt bekommen! Zitieren
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.