巧用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的变量。
我想要处理这每一条计算机名并在末尾加上”-test”字符串,于是我用循环的方式给每条计算机名添加指定的后缀信息。
但得到了如下结果,看来单纯的循环遍历肯定是不行的。
聪明的你应该知道原因,因为它是一整块数据,并不是一个个数组元素。所以如果想把它变成数组的话需要做些处理,怎么处理呢?观察下发现了一个特性,那就是每行计算机名都是单独一行,那么我们必须想办法把这块数据分割成一个个数据也就是我们所要的数组元素。
这里用split参数配合”`n”来告诉PowerShell我打算以回车为分隔来识别每一条数据,现在再来用GetType()方法看看,它已经是一个标准的数组对象了:
最后修改之前的遍历循环方法,相信就能得到我们想要的结果了。
就是这样。
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学习笔记1-Here-string
- Expecting a string, date or number here, Expression x is instead a freemarker.ext.beans.BooleanModel
- Expecting a string, date or number here, Expression x is instead a freemarker.template.TemplateBoole
- Expecting a string, date or number here, Expression x is instead a freemarker.template.TemplateBoole
- PowerShell中把Here-String转换数组对象的小技巧
- 【string 】字符串比较
- 541. Reverse String II
- ubuntu/wireshark --Lua: Error during loading: [string "/usr/share/wireshark/init.lua"]:45问题解决
- 【转】C++ stringstream介绍,使用方法与例子
- Thinking in Java 2: Arrays.toString vs. Arrays.deepToString
- UVA - 1368 DNA Consensus String
- LeetCode||87. Scramble String
- c++ CString string char* char int类型的相互转换
- hdu3336 Count the string
- mysql_escape_string()函数用法分析
- String 学习
- (转)Dataformatstring属性设置(详解)
- CStdioFile.WriteString无法向文件写入中文
- thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法