2017-02-24 41 views
2

可以说,我想要做这样的事情:获取所创建的字符串长度动态

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

如何我指的是内部($string + (Get-Random))表达式的结果,目前的长度是多少?

使用Substring(0, 20)当失败时的字符串超过20个字符

异常呼叫“串”与“2”的参数(一个或多个)短:“索引和长度 必须引用位置的字符串内参数名称:长度”

回答

4

你必须要分配新的字符串变量:

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 

正如在评论中提到,你也可以从字符串选择第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)))" 
+0

好,我压根没想到这个 – 4c74356b41

+0

@ 4c74356b41现在你呢:-) –

+0

顺便说一句,有没有其他的方式,这似乎有点hackish? ;) – 4c74356b41