【问题标题】:Get string length that is created dynamically获取动态创建的字符串长度
【发布时间】:2017-02-24 09:55:57
【问题描述】:

假设我想做这样的事情:

$string = 'arbitrary string' # << is random
(Do-Something -Name ($string + (Get-Random)).Substring(0, [math]::Min(20, ??)

如何引用($string + (Get-Random))内的表达式结果的当前长度?

当字符串短于 20 个字符时使用 Substring(0, 20) 失败

使用“2”参数调用“子字符串”的异常:“索引和长度” 必须引用字符串中的位置。参数名称:长度"

【问题讨论】:

    标签: powershell


    【解决方案1】:

    您必须将新字符串分配给一个变量:

    Do-Something -Name ($s = $string + (Get-Random)).Substring(0, [math]::Min(20,$s.Length))
    

    上面的一个不太简洁的版本:

    $Name = $string + (Get-Random)
    if($Name.Length -gt 20){
        $Name = $Name.Substring(0, 20)
    }
    Do-Something -Name $Name
    

    如 cmets 中所述,您还可以按索引从字符串中选择前 20 个字符并再次与 -join 运算符(v3.0 和更新版本)组合:

    $Name = "$string$(Get-Random)"[0..19] -join ''
    

    感觉活泼?使用正则表达式(如suggested by wOxxOm):

    $Name = "$string$(Get-Random)" -replace '^(.{20}).+','$1'
    

    如果连接的字符串少于 20 个字符,则不会替换任何内容,否则整个字符串将匹配并被前 20 个字符替换

    另一种方法是生成 X 位的随机数,其中 X 为 20 - $string.Length(仅在保证 $string 的长度在 2 到 19 个字符之间时才有效):

    $Name = "$string$(Get-Random -Min ('1' * (20 - $string.Length)) -Max ('9' * (20 - $string.Length)))"
    

    【讨论】:

    • 好吧,我什至没有想过这个
    • @4c74356b41 现在你做:-)
    • 顺便说一句,还有其他方法吗,这似乎有点骇人听闻? ;)
    • 我可以想到其他方法,例如 ("$string$(random)"[0..19]-join''),但没有任何看起来不那么 hackish 的方法
    • 另一个黑客:"$string$(Get-Random)" -replace '(?s)^(.{20}).+','$1'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多