我在PowerShell中遇到了以下行为,我无法解释并发现麻烦。
我正在一个任意目录中工作,该目录的路径显示在提示符中:
PS C:\Users\Rene\AppData\Local\Temp>
另外,get-location
报告“正确”路径:
PS C:\Users\Rene\AppData\Local\Temp> get-location
Path
----
C:\Users\Rene\AppData\Local\Temp
然后我输入mkdir xyz | cd
来创建一个目录,并将工作目录更改为这个新目录:
PS C:\Users\Rene\AppData\Local\Temp> mkdir xyz | cd
突然,提示符中的路径以Microsoft.PowerShell.Core\FileSystem::
为前缀:
PS Microsoft.PowerShell.Core\FileSystem::C:\Users\Rene\AppData\Local\Temp\xyz>
这种变化也反映在get-location
上:
PS Microsoft.PowerShell.Core\FileSystem::C:\Users\Rene\AppData\Local\Temp\xyz> get-location
Path
----
Microsoft.PowerShell.Core\FileSystem::C:\Users\Rene\AppData\Local\Temp\xyz
这是怎么回事,我怎么才能把这个前缀关闭?
2条答案
按热度按时间fzwojiic1#
按相反顺序:
如何关闭前缀?
简单,使用 * 显式 * 管道绑定!
这是怎么回事?
好问题!您在这里看到的是提供程序的小工具(
Get-ChildItem
,Get-Item
,Set-Location
等)如何实现 * 管道绑定**的副作用。当您针对
FileSystem
提供程序调用New-Item
(这是mkdir
所做的)时,它返回一个对象(对应于新创建的文件或目录),该对象具有一系列隐藏属性,PowerShell使用这些属性来跟踪提供程序之间的项目-这些可以通过Get-Member -Force
发现:当你在下游构造一个带有提供程序小程序(例如
Set-Location
/cd
)的管道语句时,它使用提供程序限定的PSPath
值来数字绑定输入对象。这可以用
Trace-Command
来观察:结果是(为了简洁起见,我删除了
Get-Item
的细节):正如你所看到的,PowerShell放弃了将
C:\
绑定到Set-Location
的-Path
参数,因为将PSPath
属性值绑定到-LiteralPath
更合适?!其原因是
-LiteralPath
参数别名为PSPath
,通过使用Get-Command
挖掘位可以看出:以这种方式实现提供程序小工具的管道绑定的真实的原因有两个:
Path
可能会产生与 globbing 相关的意外后果。Get-Item -Path 'a[bcd]'
和Get-Item -LiteralPath 'a[bcd]'
是两个非常不同的查询PSPath
值上意味着我们可以将位置切换到不同的提供程序,而不会丢失自动绑定:PS Cert:\> $aFile |Get-Content
* 只是工作 *cetgtptt2#
在Mathias发布的基础上,您可以使用一个非常简单的过滤器来保存一些输入并完成相同的事情。把它放在脚本中并运行它,直接运行它,或者把它放在你的配置文件中:
然后您可以使用:用途:
其工作原理与以下内容相同:
你可以选择任何你想要的过滤器。例如,“cdp”而不是“slp”。