Windows PowerShell每周提示(2):引用变量及变量值
当你编写脚本,尤其是系统管理脚本时,你很少提前知道你所有需要用到的值;取而代之的是,你通常需要提取信息,在一两个变量中保存信息,然后显示这些变量的值。例如,有可能有一个简单的用来从AD中提取数据的VBS脚本:
strFirstName = objUser.givenName
strLastName = objUser.sn
strTitle = objUser.title
strDepartment = objUser.department
当你获得该数据时,你会乐意回显像这样的漂亮短句:
"Ken Myer is an Accountant in Financial Services."
没什么大不了的,对么?好的,也许是这样。另一方面,毫不夸张的说,组合文字及变量值在VBS里显得有点错综复杂。例如,为了显示以上信息,你将不得不写一行类似这样的代码:
Wscript.Echo strFirstName & " " & strLastName & " is an " & strTitle & " in " & strDepartment & "."
这不是不行,但是它将变得很麻烦,也很容易遗漏空格。反过来说,这些简单错误将会导致有点不专业的输出,类似这个:
"Ken Myer is anAccountant inFinancial Services."
但是你打算如何处理这个问题呢?毕竟,你不能直接将变量嵌入字符串中。无论喜欢与否,这些“&”以及双引号标记对生活来说是不幸的事实。
不过,如果你使用Windows PowerShell,这问题将变得很容易处理。
在Windows PowerShell中显示变量值
在Windows PowerShell 中你实际上能够将变量嵌入到字符串中,PowerShell将会显示变量的值。这意味什么?那么,考虑下这个简单小巧的PowerShell脚本,某人将四个不同变量赋予不同的值,然后使用Write-Host cmdlet来回显包含每一个变量的字符串:
$FirstName = "Ken"
$LastName = "Myer"
$Title = "Accountant"
$Department = "Financial Services"
Write-Host "$FirstName $LastName is an $Title in $Department."
现在,你期待实际上会在屏幕上显示什么?无论相信与否,这就是在屏幕上显示的:
Ken Myer is an Accountant in Financial Services.
没有“&”,没有双引号,不需要担心是否要添加空格:只需要把变量包含在字符串中,PowerShell就会回显变量的值。
这是如此的简单并且显而易见这是具有革命性的。
诚然,也有可能出现当你不想要变量的值出现在屏幕的上情况:
$FirstName $LastName is an $Title in $Department.
看上去有点古怪,但是你想要在屏幕上回显什么与我们无关。如果PowerShell自动用变量值替换变量,那么你打算如何处理这个问题呢?
那也很简单;你只需用单引号将字串符引起来:
Write-Host '$FirstName $LastName is an $Title in $Department.'
单引号将使字面上的值(变量名)能够被回显;双引号能使变量的实际值被回显。
这里还有另外一个例子。就如你所知,PowerShell包含了一定数量的能返回关于PowerShell及PowerShell环境的信息的“自动”变量;例如,$pshome变量返回Windows PowerShell被安装到的文件夹。
假设我们有这样一行代码(这是很奇怪的一行代码,但是我们很宽容):
Write-Host "$pshome"
这将会返回$pshome的值;也就是说,安装PowerShell被安装到的文件夹:
C:\WINDOWS\system32\WindowsPowerShell\v1.0
现在假设我们有这行代码:
Write-Host '$pshome'
感谢单引号吧,它能返回下面的字串符值:
$pshome
毋庸讳言,这很棒。但是假设我们要回显以下的内容:
The value of the $pshome variable is C:\WINDOWS\system32\WindowsPowerShell\v1.0.
我们究竟如何实现这样的回显呢?我们怎么样既返回变量的字面上的及实际值呢,并且在同一句子中?
以下就是如何实现的方法:
Write-Host "The value of the `$pshome variable is $pshome."
看我们在这里干了什么?我们将整句句子用双引号引起来;因此你会期待PowerShell回显每一个$pshome的值。但是注意我们在第一个$pshome前放置的有趣的小符号(重音符,Tab键上面的那个符号,不是单引号):
`$pshome
这就是秘密之所在:在变量前放置重音符那么PowerShell将会回显变量名($pshome)而不是变量值。这对在双引号中引起来的整个字符串也有效-就像我们在这里做的。
换而言之,在PowerShell中组合变量及其它文字是容易的:只需把变量和字符串放置在一起,然后PowerShell就会默认回显这些变量的值。那么我们就要和“&”,双引号,以及类似这样古怪的结构说再见了:
Wscript.Echo strLastName & ", " & strFirstName & " " & strInitials & "."
英文原文
http://www.microsoft.com/technet/scriptcenter/resources/pstips/jun07/pstip0615.mspx