Powershell中所有不是我们自己的定义的变量都属于驱动器变量(比如环境变量),它的前缀只是提供给我们一个可以访问信息的虚拟驱动器.。例如env:windir,象env:驱动器上的一个”文件”,我们通过$访问它,就会返回”文件”的内容。
直接访问文件路径
通过驱动器直接访问文件路径,也支持物理驱动器,必须把文件路径放在封闭的大括号中,因为正常的文件路径包含两个特殊字符“:”和“”,有可能会被powershell解释器误解。
PS> ${c:/powershell/ping.bat} @echo off echo batch File Test pause Dir %windir%/system PS> ${c:autoexec.bat} REM Dummy file for NTVDM
上述的例子有一个限制,就是${$env:HOMEDRIVE/Powershellping.bat}不能识别,原因是$后花括号中的路径必须是具体的路径,而不能带返回值。
解决方法:
PS> Invoke-Expression "`${$env:HOMEDRIVE/Powershell/ping.bat}" @echo off echo batch File Test pause Dir %windir%/system
因为反引号”`”放在$前,会把$解析成普通字符,解释器会继续去解析第二个$,发现env:HOMEDRIVE,将其替换成c,到此 Invoke-Expression的参数就变成了${C:/Powershell/ping.bat},继续执行这个表达式就可以了。
查看Powershell支持的驱动器,可以使用Get-PSDrive查看。
Name | Root | Description |
---|---|---|
A | A: | |
Alias | Drive containing a view of the aliases stored in session state. | |
C | C: | |
cert | X509 Certificate Provider | |
E | E: | |
Env | The drive containing a view of the environment variables for the process. | |
Function | The drive containing a view of the functions stored in session state. | |
HKCU | HKEY_CURRENT_USER | The software settings for the current user. |
HKLM | HKEY_LOCAL_MACHINE | The configuration settings for the local machine. |
Variable | The drive containing a view of those variables stored in session state. | |
WSMan | Root of WsMan Config Storage. |
PSDrive中的大多都支持直接路径访问,例如可以通过函数路径,访问一个函数的具体实现。
PS> function hellow(){ Write-Host "Hellow,Powershell" } PS> $function:hellow param() Write-Host "Hellow,Powershell"
特殊的变量:子表达式
由 $+圆括号+表达式 构成的变量属于子表达式变量,这样的变量会先计算表达式,然后把表达式的值返回。
例如 变量$(3+6),可以简写成(3+6),甚至可以简写成3+6。子表达式变量也可以嵌套在文本中,例如”result=$(3+6)”。
在处理对象的属性时,会大量的用到表达式变量。例如:
PS> $file=ls Powershell_Cmdlets.html PS> $file.Length 735892 PS> "The size of Powershell_Cmdlets.html is $($file.Length)" The size of Powershell_Cmdlets.html is 735892
其实上面的代码可以简化为:
PS> "The size of Powershell_Cmdlets.html is $($(ls Powershell_Cmdlets.html).Length)" The size of Powershell_Cmdlets.html is 735892
本文链接: https://www.pstips.net/powershell-drive-variables.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
广播: PowerShell获取未使用盘符 | PowerShell 中文博客
词句:Invoke-Expression “`${$env:HOMEDRIVEPowershellping.bat}” 应改为:Invoke-Expression “`${${env:HOMEDRIVE}Powershellping.bat}”
谢谢,文章里反斜杠丢失了,在没有的反斜杠的时候,你的方法是正确的。已更新!
我在写子表达式PS C:\WINDOWS\system32> $file=ls Powershell_Cmdlets.html的时候
控制台报错:找不到路径“C:\WINDOWS\system32\Powershell_Cmdlets.html”,因为该路径不存在
这是为什么呢,这个文件Powershell_Cmdlets.html是你自己创建的吗,还是powershell本身自带的,为什么我找不到呢?
这个是我自己建的的临时文件