.net 是否可以将Powershell变量设置为固定的N个字符?

.net 是否可以将Powershell变量设置为固定的N个字符?,.net,powershell,.net,Powershell,我想知道是否可以将Powershell中的变量设置为N个字符 例1 我希望变量$Name始终固定为5个字符。 因此,如果我想写在哪里: $Name='Alex' 我期望的结果是:“Alex” Alex包含4个字符,因此变量将理解并添加必要的空格字符 例2 $Name='A' 输出:“A” “A”是一个字符,因此变量应添加4个空格 有没有办法为变量$Name设置此规则?这应该可以满足您的需要: function Set-FixedVariable { param( [parameter(

我想知道是否可以将Powershell中的变量设置为N个字符

例1

我希望变量$Name始终固定为5个字符。 因此,如果我想写在哪里:

$Name='Alex'

我期望的结果是:“Alex”

Alex包含4个字符,因此变量将理解并添加必要的空格字符

例2

$Name='A'

输出:“A”

“A”是一个字符,因此变量应添加4个空格


有没有办法为变量$Name设置此规则?

这应该可以满足您的需要:

function Set-FixedVariable {

    param( [parameter(mandatory)][string]$name,
           [parameter(mandatory)][string]$value,
           [parameter(mandatory)][int]$size
    )

    $sb = [System.Text.Stringbuilder]::new( ' ' * $size )
    [void]$sb.Insert(0, $value)

    Set-Variable -Name $name -Value $sb.ToString().Substring(0, $size) -Scope Script -Force

    return $value

}


Set-FixedVariable -name 'ab' -value 'Alex' -size 10

$ab.Length

这应该满足您的要求:

function Set-FixedVariable {

    param( [parameter(mandatory)][string]$name,
           [parameter(mandatory)][string]$value,
           [parameter(mandatory)][int]$size
    )

    $sb = [System.Text.Stringbuilder]::new( ' ' * $size )
    [void]$sb.Insert(0, $value)

    Set-Variable -Name $name -Value $sb.ToString().Substring(0, $size) -Scope Script -Force

    return $value

}


Set-FixedVariable -name 'ab' -value 'Alex' -size 10

$ab.Length

在PowerShell 5.1及更高版本中,您可以创建自定义子类:

using namespace System.Management.Automation

class StringLengthTransformationAttribute : ArgumentTransformationAttribute
{
    [ValidateRange(0,1024)]
    [int]$Length = 5

    [char]$PaddingChar = ' '

    StringLengthTransformationAttribute()
    {
    }

    StringLengthTransformationAttribute([int]$Length)
    {
        $this.Length = $Length
    }

    StringLengthTransformationAttribute([int]$Length, [char]$PaddingChar)
    {
        $this.Length = $Length
        $this.PaddingChar = $PaddingChar
    }

    [object]
    Transform([EngineIntrinsics]$engineIntrinsics, [object]$inputData)
    {
        return $inputData -replace "^(.{$($this.Length)}).*$",'$1' |% PadRight $this.Length $this.PaddingChar
    }
}
现在,当应用于变量时,它将转换您分配给它的任何内容:

[StringLengthTransformation()]$Name = 'Alex'
# $Name is now 'Alex '

$Name = 'Alexandra'
# $Name is now 'Alexa'

[StringLengthTransformation(10, '-')]$Name = 'Alex'
# $Name is now 'Alex------'

在PowerShell 5.1及更高版本中,您可以创建自定义子类:

using namespace System.Management.Automation

class StringLengthTransformationAttribute : ArgumentTransformationAttribute
{
    [ValidateRange(0,1024)]
    [int]$Length = 5

    [char]$PaddingChar = ' '

    StringLengthTransformationAttribute()
    {
    }

    StringLengthTransformationAttribute([int]$Length)
    {
        $this.Length = $Length
    }

    StringLengthTransformationAttribute([int]$Length, [char]$PaddingChar)
    {
        $this.Length = $Length
        $this.PaddingChar = $PaddingChar
    }

    [object]
    Transform([EngineIntrinsics]$engineIntrinsics, [object]$inputData)
    {
        return $inputData -replace "^(.{$($this.Length)}).*$",'$1' |% PadRight $this.Length $this.PaddingChar
    }
}
现在,当应用于变量时,它将转换您分配给它的任何内容:

[StringLengthTransformation()]$Name = 'Alex'
# $Name is now 'Alex '

$Name = 'Alexandra'
# $Name is now 'Alexa'

[StringLengthTransformation(10, '-')]$Name = 'Alex'
# $Name is now 'Alex------'

看着这些答案,我觉得人们把这件事弄得太难了。长度应该足够了

function Add-Spaces
{
Param (
    [string]$Name
)

do
{
    $name.length
    $name += ' '
}
while ($name.Length -ne '5')
}

$name = 'Bas'

Add-Spaces -Name $name

看着这些答案,我觉得人们把这件事弄得太难了。长度应该足够了

function Add-Spaces
{
Param (
    [string]$Name
)

do
{
    $name.length
    $name += ' '
}
while ($name.Length -ne '5')
}

$name = 'Bas'

Add-Spaces -Name $name


如果设置$Name=5个以上的字符,会发生什么情况?简短回答:不会,除非您使用执行此验证的自定义类型,并具有从/到字符串的转换,这几乎肯定比值得一读的内容更麻烦:您需要的是一种合适的编程语言,而不是PowerShell。这将允许您使用空格>>'{0,4}'-f'a'@MathiasR.Jessen填充一个值。我使用字符串长度验证,因为在堆栈中对此有很大的讨论:@JeroenMostert Hi,我同意你的看法,但我现在的处境是,我必须在powershell中这样做。类似于:while$Name.Length-lt 30{$Space='';$Name+=$Space}如果设置$Name=5个以上的字符,会发生什么情况?简短回答:不会,除非您使用执行此验证的自定义类型,并进行从/到字符串的转换,这几乎肯定比值得一读的内容更麻烦:您需要的是一种合适的编程语言,而不是PowerShell。这将允许您使用空格>>'{0,4}'-f'a'@MathiasR.Jessen填充一个值。我使用字符串长度验证,因为在堆栈中对此有很大的讨论:@JeroenMostert Hi,我同意你的看法,但我现在的处境是,我必须在powershell中这样做。例如:$Name.Length-lt 30{$Space='';$Name+=$Space}这还不够吗?虽然$Name.Length-lt 30{$Space='';$Name+=$Space}在函数中扭曲此值并使其可恢复,但这并不阻止修改$ab。运行$ab=bob$ab.length返回3。除了@vonPryz'有效点之外,您的函数只有在直接从脚本范围调用时才能按预期工作。否则,您将修改不同的变量,特别是当使用函数局部变量从另一个函数调用时,或者当您将此函数包含在模块中并从外部调用它时。最后,尽管这只是一个诡辩:Set-command不应该返回任何内容,除非还指定了-PassThru。函数当前返回的是原始的、未添加的值,这增加了混淆。这被认为是对提问者的一个简短帮助,而不是考虑到每种情况的全局模块的模板。然后请在回答中明确说明解决方案的局限性,作为序言。答案永远不只是询问者的;随着时间的推移,许多读者会带着略微不同的要求来到这里,因此告诉他们假设、限制和采取的捷径很重要。除此之外,您的回答目前甚至没有提到您的解决方案不满足提问者的明确要求,即在分配时也强制执行填充。这还不够吗?虽然$Name.Length-lt 30{$Space='';$Name+=$Space}在函数中扭曲此值并使其可恢复,但这并不阻止修改$ab。运行$ab=bob$ab.length返回3。除了@vonPryz'有效点之外,您的函数只有在直接从脚本范围调用时才能按预期工作。否则,您将修改不同的变量,特别是当使用函数局部变量从另一个函数调用时,或者当您将此函数包含在模块中并从外部调用它时。最后,尽管这只是一个诡辩:Set-command不应该返回任何内容,除非还指定了-PassThru。函数当前返回的是原始的、未添加的值,这增加了混淆。这被认为是对提问者的一个简短帮助,而不是考虑到每种情况的全局模块的模板。然后请在回答中明确说明解决方案的局限性,作为序言。答案永远不只是询问者的;随着时间的推移,许多读者会带着稍有不同的需求来到这里,因此告诉他们假设、限制和建议是很重要的
走捷径。除此之外,您的答案目前甚至没有提到您的解决方案不满足询问者的明确要求,即在赋值时也强制执行填充。这不满足将字符串变量限制为固定数量的字符,并对较短的值使用空格填充的原始要求。您的函数甚至不返回填充值,而是通过隐式地(可能是意外地)输出$name.Length来返回字符串长度数组。通过简单地调用$name.PadRight5'',可以在没有函数的情况下获得预期的功能,但这仍然不能满足强制执行长度的要求,并且,更重要的是,在分配给$name时,应同时执行长度限制和填充。这不满足将字符串变量限制为固定数量的字符,并对较短的值使用空格填充的原始要求。您的函数甚至不返回填充值,而是通过隐式地(可能是意外地)输出$name.Length来返回字符串长度数组。通过简单地调用$name.PadRight5'',可以在没有函数的情况下获得预期的功能,但这仍然不能满足强制执行长度的要求,更重要的是,在分配给$name时,应同时强制执行长度限制和填充。