使用Powershell和Diskpart扩展具有可用空间的卷

时间:2015-07-31 15:00:20

标签: powershell

我们所有的服务器都在增加磁盘分配。我不想打字:

Select disk 6
Select Partition 1
Extend
Select disk 7
Select Partition 1
Extend
.....

每台服务器10卷,100台服务器......

有没有办法让powershell扫描磁盘,寻找可用空间大于100MB的磁盘。然后让它扩展所述磁盘上的分区?

运行2008R2的服务器

$psVersion Table 
Name                           Value
----                           -----
CLRVersion                     2.0.50727.5485
BuildVersion                   6.1.7601.17514
PSVersion                      2.0
WSManStackVersion              2.0
PSCompatibleVersions           {1.0, 2.0}
SerializationVersion           1.1.0.1
PSRemotingProtocolVersion      2.1

3 个答案:

答案 0 :(得分:3)

由于diskpart从STDIN读取命令,您可以执行以下操作:

'list disk' | diskpart | Where-Object {
    $_ -match 'disk (\d+)\s+online\s+\d+ .?b\s+\d+ [gm]b'
} | ForEach-Object {
    $disk = $matches[1]
    "select disk $disk", "list partition" | diskpart | Where-Object {
        $_ -match 'partition (\d+)'
    } | ForEach-Object { $matches[1] } | ForEach-Object {
        "select disk $disk", "select partition $_", "extend" | diskpart | Out-Null
    }
}

第一个正则表达式仅选择MB或GB范围([gm]b)中具有可用空间的磁盘。根据需要进行调整。

diskpart次来电话包含在功能中,让它们更容易消化,并且#34;:

function List-Disks {
    'list disk' | diskpart |
        Where-Object { $_ -match 'disk (\d+)\s+online\s+\d+ .?b\s+\d+ [gm]b' } |
        ForEach-Object { $matches[1] }
}

function List-Partitions($disk) {
    "select disk $disk", "list partition" | diskpart |
        Where-Object { $_ -match 'partition (\d+)' } |
        ForEach-Object { $matches[1] }
}

function Extend-Partition($disk, $part) {
    "select disk $disk","select partition $part","extend" | diskpart | Out-Null
}

List-Disks | ForEach-Object {
    $disk = $_
    List-Partitions $disk | ForEach-Object {
        Extend-Partition $disk $_
    }
}

答案 1 :(得分:0)

相同的解决方案,但更简单,它也适用于其他语言环境:

function Extend-Partition($disk, $part)
{
  "select disk $disk","select partition $part","extend" | diskpart | Out-Null
}

$disks = ((wmic diskdrive get Index | Select-String "[0-9]+") -replace '\D','')

ForEach ($disk in $disks) {

    $parts = ((wmic partition where DiskIndex=$diskId get Index | Select-String "[0-9]+") -replace '\D','' | %{[int]$_ + 1})

    ForEach ($part in $parts) {
        Extend-Partition $disk $part
    }
}

答案 2 :(得分:0)

对于vSphere / ESX中的VM

在vSphere中扩展VMDK后,Windows客户操作系统的扩展并不总是显而易见。在采取以下步骤之前,有时它根本看不到它。

通常,您必须打开磁盘管理并为系统执行刷新,然后查看已添加的其他空间。只有在那之后才能在Windows中展开驱动器。

如果您已经进入并完成了刷新,上面的两个脚本工作正常,但显然所有这一切的重点是尽可能多地省力。我测试并添加到第一个脚本。完全按照我的需要工作。

更新 - 磁盘 - 数量$匹配[1]是关键线。

function List-Disks {
'list disk' | diskpart |
? { $_ -match 'disk (\d+)\s+online\s+\d+ .?b\s+\d+ [gm]b' } |
% { $matches[1] } 
Update-Disk -Number $matches[1]
}

function List-Partitions($disk) {
"select disk $disk", "list partition" | diskpart |
? { $_ -match 'partition (\d+)' } |
% { $matches[1] }
}

function Extend-Partition($disk, $part) {
"select disk $disk","select partition $part","extend" | diskpart | 
Out-Null
}

List-Disks | % {
$disk = $_
List-Partitions $disk | % {
Extend-Partition $disk $_
}
}

抱歉丑陋的格式化。