Powershell上的条件参数

时间:2016-10-05 13:21:03

标签: powershell parameters

我有一个简单的PS脚本来查询卷大小和用法:

<#
.SYNOPSIS
This is a simple Powershell script to display Free space on a remote machine (in GB and percentage).

.DESCRIPTION
The script uses WMI. It excludes Zero size volumes (usually CD/DVD drives). 
Parameters: Computername (remote computer FQDN).
The result is sorted by % free space

.EXAMPLE
Get-VolumeFreeSpace -ComputerName dc.contoso.local -Creds contoso\superadmin
Result:

Device Size (GBs) Free (GBs) Free %
------ ---------- ---------- ------
C:             70         50     71
D:             50         49     98

.NOTES

#>

Function Get-VolumeFreeSpace {

Param(
  [string]$Computername

  )

  Get-WmiObject -Class Win32_LogicalDisk -Namespace "root\cimv2" -ComputerName $Computername | where {$_.Size -gt 0} | 

Select @{Name="Device";E={$_.DeviceID.Trim()}}, 
@{Name="Size (GBs)";E={[math]::Round($_.Size / 1GB)}},
@{Name="Free (GBs)";E={[math]::Round($_.FreeSpace / 1GB)}},
@{Name="Free %";E={[math]::Round(($_.FreeSpace*100)/($_.Size))}} | Sort-Object "Free %" | ft -autosize

}

我原来有一个$ Creds参数来传递GWMI凭证,以防活动用户不在,并且要查询服务器的管理员但是假设该用户有一个他/她可以用来查询服务器的管理员帐户。

这里的问题是,如果我添加$ Creds参数,如果需要凭据,它将触发nomatter。

我想要的是什么:

检查执行该功能的用户是否是管理用户。它们都以某些特定字母开头:admXXXX,admYYYY等。因此,我们的想法是对执行用户进行字符串验证,如果其名称以&#34; adm&#34;开头。继续WMI查询,如果没有,请询​​问凭据。基本上,使$ Creds参数成为条件。

谢谢!

1 个答案:

答案 0 :(得分:1)

我通常使用的方法是使用函数的可选参数,splatting

Function Get-VolumeFreeSpace {

  Param(
      [string]$Computername,
      [PSCredential]$Credential
  )

  $params = @{
      Class = 'Win32_LogicalDisk'
      Namespace = 'root\cimv2'
      ComputerName = $ComputerName
  }
  if ($Credential) {
      $params.Credential = $Credential
  }

  Get-WmiObject @params | where {$_.Size -gt 0} | 

  Select @{Name="Device";E={$_.DeviceID.Trim()}}, 
  @{Name="Size (GBs)";E={[math]::Round($_.Size / 1GB)}},
  @{Name="Free (GBs)";E={[math]::Round($_.FreeSpace / 1GB)}},
  @{Name="Free %";E={[math]::Round(($_.FreeSpace*100)/($_.Size))}} | Sort-Object "Free %" | ft -autosize

}

请注意,您也不必展开每个参数,您可以将其混淆:

$params = @{
    Class = 'Win32_LogicalDisk'
    Namespace = 'root\cimv2'
}
if ($Credential) {
    $params.Credential = $Credential
}

Get-WmiObject @params -ComputerName $Computer