2016-08-15 26 views
0

我最近在Windows 10系统上开始使用Powershell。我创建了一个配置文件,并且我想放入一个链接到我的文档部分中的文件夹的变量。但是,我不想对路径进行硬编码,因为我知道如果我的配置文件名称在硬盘传输过程中发生变化,我就需要进入并重新编写它,就像我上次发送它时一样维修。所以我的第一个想法是把这样的东西:Resolve-Path cmdlet究竟做了什么?

$Var = $(~\Documents\Folder) 

但是,吐出一个错误。然后我了解了Resolve-Path Cmdlet,一眼就可以看到我需要的东西。但是,我这样做的时候:

$Var = $(Resolve-Path ~\Documents\Folder) 

...我得到这样的:

>$Var 

Path 
---- 
C:\Users\Username\Documents\Folder 

> 

这似乎是一个问题。但是,当我尝试cd $Var时,它成功运行,这让我很困惑。我认为结果中无关的Path标题会导致错误。

究竟是什么Resolve-Path,为什么它仍然得到正确解释时,传递到cd?另外,有没有办法让Resolve-Path不是包含无关信息并只返回扩展路径?

回答

2

原因你看到的头Path是因为Resolve-Path将返回System.Management.Automation.PathInfo类型的对象,并且当该不捕捉到一个变量它被输出作为一个字符串到控制台以可读格式IE:

ObjProperty1  ObjProperty2  ObjProperty3 ... 
---------   ---------   ---------  ... 
Value1   Value2   Value3  ... 

该对象与cd一起使用,因为PowerShell足够智能,可以在运行cd之前解析对象($var)。 PowerShell将返回路径属性的值为cd意味着cd将看到一个字符串"C:\Users\Username\Documents\Folder"而不是对象标题。

如果你只想返回无头的路径使用Select小命令的参数-ExpandProperty

$var = Resolve-Path '~\Documents\Folder' | select -ExpandProperty Path 

如果你想在Resolve-Path MSDN是开始(link)的好地方更多的信息。

+0

谢谢!我一定错过了返回类型,否则我会更深入地考虑它。选择'只是说'().Path'就像另一个答案所说的那样有什么特别的优势吗? – BHustus

+0

@Bustus不,使用ether之后没有任何优势,因为它们最终都会调用相同的检索命令。 – Richard

0

简单的例子为解决路径工作,

比方说,你不知道你的计算机的Office版本,并希望得到正确的路径,Resolve-Path可以帮助...

$TestPath = 'C:\Program Files (x86)\Microsoft Office\*\Winword.exe' 
$Path = (Resolve-Path $TestPath).Path 
+0

我不想知道'Resolve-Path'是用来做什么的 - 我已经知道了。我想知道为什么它表现得很奇怪。但是,感谢给我一个选项,只存储路径。 – BHustus