2016-03-20 2 views
0

Bir komut dosyası ile ilgili bir sorunum var. Firmware tipini kontrol ediyorum ve bundan sonra sabit sürücüyü buna göre biçimlendiriyorum. Sorun şu ki komutunu çalıştırdığında bir hata alıyorum olmasıdırkonumsal parametre bulunamadı argüman kabul

New-Partition -DiskNumber 0 -GptType '{ebd0a0a2-b9e5-4433-87c0-68b6b72699c7}' $partsize_param -DriveLetter C 

Diyor

a positional parameter cannot be found that accept argument '-UseMaxiumSize' 
+ categoryinfo  : invalidargument: (:) [New-Partition], ParameterBindingException 
+ fullyqualifiederror: PositionalParameterNotFound, New-Partition

komik bir şey sadece iyi komutu çalıştırır ben -UseMaximumSize yerine $partsize_param

ait kullanıyorsam olmasıdır

Birisi, yaptığım hataya işaret edebilir mi?

function clean_install_hdd() { 
    Switch (Get-BiosType) { 
     1  {$firmwaremode='Legacy BIOS'} 
     2  {$firmwaremode='UEFI Mode'} 
     Default {$firmwaremode='Unknown'} 
    } 
    Get-Disk 

    $PartitionSize = Read-Host "Partition size - How many GB or max to use all available space" 

    if ("$PartitionSize" -eq "max") { 
     $partsize_param = '-UseMaximumSize' 
    } else { 
     $partsize_param = '-Size ' + $PartitionSize 
    } 

    if ("$firmwaremode" -eq "Legacy BIOS") { 
     Clear-Disk 0 -RemoveData -RemoveOEM -Confirm:$false; Initialize-Disk 0 -PartitionStyle MBR -Confirm:$false 
     New-Partition -DiskNumber 0 -$partsize_param -DriveLetter C -IsActive | Format-Volume -FileSystem NTFS -NewFileSystemLabel Windows -ShortFileNameSupport $False -Confirm:$false 
    } 
    if ("$firmwaremode" -eq "UEFI Mode") { 
     Clear-Disk 0 -RemoveData -RemoveOEM -Confirm:$false; Initialize-Disk 0 -PartitionStyle GPT -Confirm:$false 
     $systemPart = New-Partition -DiskNumber 0 -GptType '{c12a7328-f81f-11d2-ba4b-00a0c93ec93b}' -Size 100MB -DriveLetter S 
     & format.com "$($systemPart.DriveLetter):" /FS:FAT32 /Q /Y | Out-Null 
     New-Partition -DiskNumber 0 -GptType '{e3c9e316-0b5c-4db8-817d-f92df00215ae}' -Size 128MB 
     Write-Host $partsize_param 
     New-Partition -DiskNumber 0 -GptType '{ebd0a0a2-b9e5-4433-87c0-68b6b72699c7}' $partsize_param -DriveLetter C | Format-Volume -FileSystem NTFS -NewFileSystemLabel Windows -ShortFileNameSupport $False -Confirm:$false 
    } 
}​ 

cevap

1

Bir değişkeni parametre adı olarak kullanamazsınız (kolayca). Bu, variable splatting'u kullanmanın iyi bir durumudur. Bu, hash tablosunda dinamik bir parametre kümesini kolayca oluşturmanıza olanak tanır.

function clean_install_hdd() { 
    Switch (Get-BiosType) { 
     1  {$firmwaremode='Legacy BIOS'} 
     2  {$firmwaremode='UEFI Mode'} 
     Default {$firmwaremode='Unknown'} 
    } 
    Get-Disk 

    $PartitionSize = Read-Host "Partition size - How many GB or max to use all available space" 

    $Params = @{ 
     DiskNumber = 0 
     DriveLetter = "C" 
    }; 

    if ($PartitionSize -eq "max") { 
     $Params.Add("UseMaximumSize",$true); 
    } else { 
     $Params.Add("Size", $PartitionSize); 
    } 

    if ("$firmwaremode" -eq "Legacy BIOS") { 
     Clear-Disk 0 -RemoveData -RemoveOEM -Confirm:$false; Initialize-Disk 0 -PartitionStyle MBR -Confirm:$false; 
     $Params.Add("IsActive",$true); 
     New-Partition @Params | Format-Volume -FileSystem NTFS -NewFileSystemLabel Windows -ShortFileNameSupport $False -Confirm:$false 
    } 
    if ("$firmwaremode" -eq "UEFI Mode") { 
     Clear-Disk 0 -RemoveData -RemoveOEM -Confirm:$false; Initialize-Disk 0 -PartitionStyle GPT -Confirm:$false 
     $systemPart = New-Partition -DiskNumber 0 -GptType '{c12a7328-f81f-11d2-ba4b-00a0c93ec93b}' -Size 100MB -DriveLetter S 
     & format.com "$($systemPart.DriveLetter):" /FS:FAT32 /Q /Y | Out-Null 
     New-Partition -DiskNumber 0 -GptType '{e3c9e316-0b5c-4db8-817d-f92df00215ae}' -Size 128MB 
     Write-Host $partsize_param 
     $Params.Add("GptType","{ebd0a0a2-b9e5-4433-87c0-68b6b72699c7}"); 
     New-Partition @Params | Format-Volume -FileSystem NTFS -NewFileSystemLabel Windows -ShortFileNameSupport $False -Confirm:$false 
    } 
} 
+0

Teşekkür ederiz. Anlıyorum. Ben aynı dosyayı toplu iş dosyasında yaptığımda kullandığım benzer bir şeyi kullanmaya çalıştım ama aynı şekilde powershell'de çalışmıyor. –

2

Çok gibi edebi bir dize ile bir parametre adı yerini alamaz:

$p = "-ParamName" 
Get-Stuff $p 

ayrıştırıcı bir konumsal parametreye bir argüman olarak dizesi "-ParamName" yorumlayacaktır. Konumsal parametre bulunamadığından, hata atılır.

gibi durumda da dinamik parametre argümanları ele uygun yolu, splatting kullanmaktır:

$params = @{} 

if ("$PartitionSize" -eq "max") { 
    $params['UseMaximumSize'] = $true 
} else { 
    $params['Size'] = $PartitionSize 
} 

New-Partition @params 

Sen Hashtable'a tüm adlı parametre argümanlar koymak edebilir veya sadece kısmi bir dizi uyarısı olabilir Parametreler: