您的位置:首页 > 运维架构 > Shell

巧用Here-String

2018-02-24 18:46 274 查看
你或许听过Here-String也有可能在其它地方见过,比如Linux等其它地方。因为Here-String并不是PowerShell中独有的特性,我们很多时候都会把一些未经处理的非格式化数据放入Here-String中,因为Here-String可以用来解析显示大段字符串数据,在特殊的场景下极为有用。

先来看一下在PowerShell中定义Here-String的标准格式:

@<引号>
<内容行>
<内容行>
<内容行>
<内容行>
<内容行>
<引号>@


这里尤其要注意的是格式的排版,必须要按照上面的格式去定义,否则你会看到像下面这样PowerShell就会报一个内容解析错误。



你一定要按照这样的格式去定义一个Here-String,起始的@”和内容行以及收尾的“@都不能放在同一行里。



现在明白了如何定义格式后,来试试Here-String的效果,最直观的效果就是Here-String可以直接输出你在内容行里定义的一切内容。

当然内容行里所包含的内容不应该仅仅是纯字符串吧,如果写一个变量进去会是什么效果,会不会把我们的变量值解析出来呢?



果然猜对了,定义在Here-String里的变量被正常解析了出来。

那如果遇到一种情况是,我就是希望Here-String直接能够输出变量的字面值(也就是变量的本身),而不是变量的值改怎么做呢,还记得文章一开始定义Here-String的格式方法么
@<引号><内容行><内容行><引号>@
,里面提到了引号,引号有单双引号之分,那么这里只需要把双引号改为单引号就可以了,因为单引号有着所见即所得般的作用效果。



其实Here-String除了上面提到的一些本质特性外,可以利用它支持字符串段落显示的特性来做一些字符串处理。假设我们有一组未经处理的字符串信息,这组字符串里包含了一系列计算机名,我把这些字符串放进Here-String里并且复制给一个名为computers的变量。

$computers = @"
Computer1
Computer2
Computer3
Computer4
Computer5
Computer6
Computer7
Computer8
"@


我想要处理这每一条计算机名并在末尾加上”-test”字符串,于是我用循环的方式给每条计算机名添加指定的后缀信息。

$computers = @"
Computer1
Computer2
Computer3
Computer4
Computer5
Computer6
Computer7
Computer8
"@

foreach($cn in $computers)
{
$cn+"-test"
}


但得到了如下结果,看来单纯的循环遍历肯定是不行的。

Computer1
Computer2
Computer3
Computer4
Computer5
Computer6
Computer7
Computer8-sh


聪明的你应该知道原因,因为它是一整块数据,并不是一个个数组元素。所以如果想把它变成数组的话需要做些处理,怎么处理呢?观察下发现了一个特性,那就是每行计算机名都是单独一行,那么我们必须想办法把这块数据分割成一个个数据也就是我们所要的数组元素。

$computers = @"
Computer1
Computer2
Computer3
Computer4
Computer5
Computer6
Computer7
Computer8
"@

$newComputers = ($computers -split "`n")


这里用split参数配合”`n”来告诉PowerShell我打算以回车为分隔来识别每一条数据,现在再来用GetType()方法看看,它已经是一个标准的数组对象了:

IsPublic IsSerial Name       BaseType
-------- -------- ----       --------
True     True     String[]   System.Array


最后修改之前的遍历循环方法,相信就能得到我们想要的结果了。

$computers = @"
Computer1
Computer2
Computer3
Computer4
Computer5
Computer6
Computer7
Computer8
"@

$newComputers = ($computers -split "`n")

foreach($cn in $newComputers)
{
$cn+"-sh"
}


就是这样。

Computer1-test
Computer2-test
Computer3-test
Computer4-test
Computer5-test
Computer6-test
Computer7-test
Computer8-test


Here-String的用法非常简单,只需要记住两个@<引号>和<引号>@一定不能再同一行声明。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  powershell