将字符串转换为字节

时间:2015-10-29 12:58:41

标签: string powershell type-conversion

我在将字符串变量转换为字节时遇到了一些困难。

工作代码:

$fqtm = New-Object -ComObject Fsrm.FsrmQuotaManager
$quota = $fqtm.GetQuota('E:\HOME\folder')
$quota.QuotaLimit = 15GB
$quota.Commit()

无效代码:

$Limit = '15GB'
$fqtm = New-Object -ComObject Fsrm.FsrmQuotaManager
$quota = $fqtm.GetQuota('E:\HOME\folder')
$quota.QuotaLimit = $Limit
$quota.Commit()

问题是值15GB用作字符串而不是INT64。所以我没有运气就尝试了以下内容:

$quota.QuotaLimit = ($Limit -as [Int64])
$quota.QuotaLimit = [Int64]$Limit

有没有办法克服这个转换问题?

$Limit变量来自哪里:

# GroupName example: 'WORLD EU Home Drives 5GB'
# GroupName example: 'WORLD EU Home Drives 15GB'
$Users = Get-ADGroup -SearchBase 'OU=EU,OU=world,DC=domain,DC=net' -Filter "Name -like '$GroupName*' " | % {
    $Limit = $_.Name.Split(' ')[-1]
    Get-ADGroupMember $_ -Recursive | Get-ADUser -Properties HomeDirectory | where {$_.Enabled -and $_.HomeDirectory} | % {
        Write-Verbose "User '$($_.Name)' - Limit '$Limit' - HomeDrive '$($_.HomeDirectory)'"
        [PSCustomObject]@{
            User          = $_.Name
            Limit         = $Limit
            HomeDirectory = $_.HomeDirectory
        }
    }
}

1 个答案:

答案 0 :(得分:3)

好吧,你已将'15GB'放在引号中,这意味着你想要一个字符串。只需删除引号,PS就会将其转换为int值:

$Limit = 15GB

P.S。我刚检查过,它在我的电脑上生成Int64

PS C:\Users\xxx> Get-Host

Name             : ConsoleHost
Version          : 4.0
InstanceId       : 1d32179c-6b30-4ff8-9b9d-9321fb71cb59
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : ru-RU
CurrentUICulture : en-US
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace

PS C:\Users\xxx> $Limit = 15GB
PS C:\Users\xxx> $Limit.GetType()

IsPublic IsSerial Name        BaseType
-------- -------- ----        --------
True     True     Int64       System.ValueType

PS C:\Users\xxx> $Limit
16106127360
  

我已将OP更新为更清晰。所以你可以看到数据的位置   

来自

好的,我现在看到了你的问题。试试这个黑客:

$quota.QuotaLimit = [scriptblock]::Create($Limit).InvokeReturnAsIs()

它对我有用:

PS C:\Users\xxx> $Limit = '15GB'
PS C:\Users\xxx> [scriptblock]::Create($Limit).InvokeReturnAsIs()
16106127360
  然而,如果它能够被保存在适当的位置,那将是很好的   代码开头的格式$Limit = $_.Name.Split(' ')[-1]

试试这个:

$Limit = [scriptblock]::Create(($_.Name.Split(' ')[-1])).InvokeReturnAsIs()