从FileInfo对象获取目录名称

时间:2017-10-18 11:28:00

标签: powershell

我正在寻找可执行位置,我使用以下命令:

PS C:\> dir -recurse -filter "notepad++.exe" -ErrorAction SilentlyContinue | select -first 1 -Property Directory

它返回:

Directory
---------
C:\Program Files (x86)\OpenSource\Notepad++

如何获取字符串“C:\ Program Files(x86)\ OpenSource \ Notepad ++”? 我尝试了很多不同的命令但没有一个工作

2 个答案:

答案 0 :(得分:2)

我将逐步接受这个问题,在我的答案的第一部分结尾处提供单行解决方案。

针对您案例的具体解决方案

现在,您正在接收一个对象。一个简单的解决方案是将对象存储在变量中,并使用ToString()方法以字符串形式访问目录的路径。

$a = dir -recurse -filter "notepad++.exe" -ErrorAction SilentlyContinue | select -first 1 -Property Directory
$a.Directory.ToString()

在这种情况下,您还可以缩短dir来电,如下面的代码段所示。

$a = dir -recurse -filter "notepad++.exe" -ErrorAction SilentlyContinue | select -first 1
$a.Directory.ToString()

或者使用DirectoryName属性,就像在Bacon Bits中一样。

$a = dir -recurse -filter "notepad++.exe" -ErrorAction SilentlyContinue | select -first 1
$a.DirectoryName

最后,你也可以在一行中完成。

dir -recurse -filter "notepad++.exe" -ErrorAction SilentlyContinue | select -first 1 | % { $_.Directory.ToString() }

或者,再次使用DirectoryName属性。

dir -recurse -filter "notepad++.exe" -ErrorAction SilentlyContinue | select -first 1 | % { $_.DirectoryName }

上面的所有解决方案都会在您的系统上以字符串的形式返回路径。

C:\Program Files (x86)\OpenSource\Notepad++

解决方案的一般方法

如果要在PowerShell中访问对象的任何属性,则需要首先了解可用的属性。只需将对象传递给Get-Member Cmdlet,PowerShell就会打印出TypeName以及属性名称,类型和定义表。

dir -recurse -filter "notepad++.exe" -ErrorAction SilentlyContinue | select -first 1 | Get-Member

快速网络研究可以提供有关对象类型的更多信息。

当您知道要使用哪个属性时,可以使用以下方法之一访问它。

  1. 存储返回的对象(例如a)并使用$a.PropertyName
  2. 访问该属性
  3. 将对象传递给% { $_.PropertyName }
  4. 使用-ExpandProperty PropertyName,就像Bacon Bits一样。
  5. 只需使用最适合您剩余代码的样式。

    -Property-ExpandProperty之间的差异

    -Property将为您提供一个对象,其中包含此属性。

    -ExpandProperty将返回该属性。

答案 1 :(得分:1)

使用-ExpandProperty的{​​{1}}参数,并要求Select-Object属性而不是DirectoryName属性:

Directory