【问题标题】:Cast incoming $args as string value将传入的 $args 转换为字符串值
【发布时间】:2013-11-28 04:22:40
【问题描述】:

我的 powershell 脚本与一个以格式发送不同数量参数的外部程序交互

primary site=Peachtree Street

并用逗号分隔

primary site=Peachtree Street, last logon=13 Nov 2013, sender-ip-10.10.10.10

我一直在互联网上搜索如何将 $args 转换为字符串 - 否则 $args 会删除逗号,我需要逗号

这是我对 $args 的尝试

sender-ip=10.10.10.10,主站点位置=peachtree 街,创建者=jsmith

第一个脚本

write-host $args

$args = $args | Out-String

write-host $args

第一个输出

sender-ip=10.10.10.10 primary site location=peachtree street created by=jsmith
sender-ip=10.10.10.10
primary
site
location=peachtree
street
created
by=jsmith

第二个脚本

write-host $args

$args = "'" + $args + "'"

write-host $args

第二个输出

sender-ip=10.10.10.10 primary site location=peachtree street created by=jsmith
'System.Object[] site location=peachtree System.Object[] by=jsmith'

第三个脚本

write-host $args

foreach ($i in $args){
   $i = $i | Out-String
}

write-host $args

第三个输出

sender-ip=10.10.10.10 primary site location=peachtree street created by=jsmith
sender-ip=10.10.10.10 primary site location=peachtree street created by=jsmith

但是如何保留逗号????

请帮忙!!!

【问题讨论】:

    标签: powershell args


    【解决方案1】:

    引用您的输入,例如

    "sender-ip=10.10.10.10, primary site location=peachtree street, created by=jsmith" 
    

    逗号用于创建数组,但在文本周围加上引号时,它会将所有内容保存为单个字符串。

    我个人还建议您避免使用args,而是创建一个参数,这样您就可以将其称为-paramtername "sender-ip=10.10.10.10, primary site location=peachtree street, created by=jsmith"。或者至少使用$args[0]。如果有人忘记了引号,事情可能会中断,因为 $args 会变成一个数组。

    更新:这应该可以。然而,这是一个“肮脏的修复”。

    Write-Host (($args | % { $_ -join ", " }) -join " ")
    

    【讨论】:

    • 但是如何引用我的输入?这就是我正在努力解决的问题。外部程序访问脚本并发送不同数量的参数,程序只是去掉逗号。如果我在控制输入,那么问题就解决了!
    • 程序如何访问脚本?你能控制它如何调用 PS 脚本吗?
    【解决方案2】:

    您是否考虑过编写脚本以将其作为管道输入而不是参数?

    $script = @'
    Begin{}
    Process {$_}
    End {}
    '@
    
     $script | set-content testscript.ps1
    
     'primary site=Peachtree Street, last logon=13 Nov 2013, sender-ip-10.10.10.10' | ./testscript.ps1
    
    primary site=Peachtree Street, last logon=13 Nov 2013, sender-ip-10.10.10.10
    

    那么你就不受参数解析的影响了。

    【讨论】:

    • 我从没想过!让我研究一下,我会及时通知你的。谢谢!!
    • 它需要示例脚本中的引号来创建字符串。来自应用程序的它已经是一个字符串。它只是不会根据字符串中的空格解析为参数数组。
    【解决方案3】:

    由于您无法控制自己的输入,因此类似这样的操作可能会让您回到逗号分隔的列表。

    ($args | select $_) -join ','
    

    【讨论】:

      【解决方案4】:

      人们似乎总是忘记可怜的旧输出字段分隔变量$OFS 例如:

      C:\PS> function foo {$OFS=',';"$args"}
      C:\PS> foo sender-ip=10.10.10.10 primary site location=peachtree street created by=jsmith
      sender-ip=10.10.10.10,primary,site,location=peachtree,street,created,by=jsmith
      

      无论$OFS 包含什么字符串,当它连接在一起以显示为字符串时,将在数组的元素之间使用 - 通常是在双引号字符串中引用包含数组的变量时。

      【讨论】:

        猜你喜欢
        • 2018-05-09
        • 1970-01-01
        • 2019-01-03
        • 2020-08-23
        • 2021-01-01
        • 1970-01-01
        • 2012-05-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多