如何让 Select-Object 返回原始类型(例如String) 而不是 PSCustomObject?

StackOverflow https://stackoverflow.com/questions/618749

  •  03-07-2019
  •  | 
  •  

下面的代码给了我一个 PSCustomObjects 数组,我怎样才能让它返回一个字符串数组?

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!($_.psiscontainer)}

(作为第二个问题,psiscontainer 部分的用途是什么?我从网上的一个例子复制的)

接受后编辑: 两个很好的答案,希望我能把它们都标记出来。已授予原答案。

有帮助吗?

解决方案

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

Get-ChildItem $directory -Recurse

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

Select-Object FullName

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

Get-ChildItem $directory -Recurse

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

Select-Object FullName

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

foreach {

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

Get-ChildItem $directory -Recurse

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

Select-Object FullName

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

Get-ChildItem $directory -Recurse

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

Select-Object FullName

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

foreach {'hello'; 

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

Get-ChildItem $directory -Recurse

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

Select-Object FullName

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

Get-ChildItem $directory -Recurse

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

Select-Object FullName

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

foreach {

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

Get-ChildItem $directory -Recurse

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

Select-Object FullName

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

Get-ChildItem $directory -Recurse

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

Select-Object FullName

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

foreach {'hello'; 

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

Get-ChildItem $directory -Recurse

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

Select-Object FullName

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

Get-ChildItem $directory -Recurse

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

Select-Object FullName

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

foreach {

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

Get-ChildItem $directory -Recurse

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

Select-Object FullName

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

Get-ChildItem $directory -Recurse

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

Select-Object FullName

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

foreach {'hello'; 

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

Get-ChildItem $directory -Recurse

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

Select-Object FullName

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

Get-ChildItem $directory -Recurse

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

Select-Object FullName

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

foreach {

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

Get-ChildItem $directory -Recurse

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

Select-Object FullName

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

Get-ChildItem $directory -Recurse

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

Select-Object FullName

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

<*>

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.psiscontainer)} | foreach {

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

<*>

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

<*>

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

<*>

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.FullName}

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

<*>

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

<*>

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.psiscontainer)}

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.psiscontainer)} | foreach {

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

<*>

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

<*>

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

<*>

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.FullName}

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

<*>

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

<*>

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.FullName}

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.psiscontainer)} | foreach {

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

<*>

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

<*>

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

<*>

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.FullName}

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

<*>

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

<*>

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.psiscontainer)}

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.psiscontainer)} | foreach {

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

<*>

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

<*>

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

<*>

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.FullName}

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

<*>

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

<*>

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.FullName; 1; 2; 3}

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.psiscontainer)} | foreach {

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

<*>

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

<*>

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

<*>

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.FullName}

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

<*>

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

<*>

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.psiscontainer)}

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.psiscontainer)} | foreach {

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

<*>

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

<*>

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

<*>

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.FullName}

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

<*>

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

<*>

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.FullName}

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.psiscontainer)} | foreach {

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

<*>

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

<*>

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

<*>

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.FullName}

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

<*>

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

<*>

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.psiscontainer)}

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.psiscontainer)} | foreach {

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

<*>

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

<*>

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

<*>

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.FullName}

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

<*>

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

<*>

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.FullName; $ x = 1; 2; 3}

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出管道中。作为一项实验,尝试用以下方法替换该阶段:

<*>

实际上尝试一下并检查输出。该代码块中有四个值。它们都没有消耗掉。请注意,它们都出现在输出中。现在试试这个:

<*>

请注意,其中一个值正由变量捕获。它不会出现在输出管道中。

.psiscontainer)} | foreach {

您只需从对象中挑选出您想要的属性即可。在这种情况下, FullName

<*>

编辑:Mark的解释,谁问,“foreach做了什么?什么是枚举?

Sung Meister的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。

关键概念是管道。想象一系列乒乓球一个接一个地滚下一根细管。这些是管道中的对象。管道的每个阶段 - 由管道(|)字符分隔的代码段 - 都有一个管道进入它,管道从它出来。一级的输出连接到下一级的输入。每个阶段在对象到达时对其进行处理,对它们执行操作,并将它们发送回输出管道或发送新的替换对象。

<*>

Get-ChildItem遍历文件系统,创建FileSystemInfo对象,代表它遇到的每个文件和目录,并将它们放入管道。

<*>

Select-Object在每个FileSystemInfo对象到达时获取它,从中获取FullName属性(在这种情况下是一个路径),将该属性放入它创建的全新自定义对象中,并将该自定义对象放入管道。

<*>

这是一个过滤器。它需要每个对象,检查它,并将其发回或根据某些条件丢弃它。顺便说一句,这里的代码有一个bug。到达此处的自定义对象没有psiscontainer属性。这个阶段实际上并没有做任何事情。 Sung Meister的代码更好。

<*>

Foreach,其长名称为ForEach-Object,在它到达时抓取每个对象,并在此处从中获取FullName属性(字符串)。现在,这里是一个微妙的部分:任何未消耗的值,即未被变量捕获或以某种方式被抑制的值,都会被放入输出

其他提示

要获取文件名的字符串,您可以使用

$files = Get-ChildItem $directory -Recurse | Where-Object {!(

要获取文件名的字符串,您可以使用

<*>

-ExpandProperty 参数允许您根据指定属性的类型返回对象。

进一步测试表明,这不适用于V1,但从V2 CTP3开始,该功能已得到修复。

.psiscontainer)} | Select-Object -ExpandProperty FullName

-ExpandProperty 参数允许您根据指定属性的类型返回对象。

进一步测试表明,这不适用于V1,但从V2 CTP3开始,该功能已得到修复。

对于问题 #1

我删除了“选择对象”部分 - 它是多余的,并在“foreach”之前移动了“where”过滤器,与此不同 唐甫的回答 - 尽快过滤,以便您只处理下一条管道中必须处理的部分内容。

$files = Get-ChildItem $directory -Recurse | Where-Object {!$_.PsIsContainer} | foreach {$_.FullName}

该代码片段本质上是这样的

  • 递归获取所有文件的完整路径(Get-ChildItem $directory -Recurse)
  • 过滤掉目录(Where-Object {!$_.PsIsContainer})
  • 仅返回完整文件名(foreach {$_.FullName})
  • 将所有文件名保存到 $files 中

请注意,对于 foreach {$_.FullName}, ,在 powershell 中,返回脚本块 ({...}) 中的最后一条语句,在本例中为字符串类型的 $_.FullName

如果您确实需要获取原始对象,则在摆脱“select-object”后无需执行任何操作。如果您要使用 Select-Object 但想要访问原始对象,请使用“PsBase”,这是一个完全不同的问题(主题) - 请参阅“PSBASE、PSEXTENDED、PSADAPTED 和 PSOBJECT 有何变化?“有关该主题的更多信息

对于问题 #2

并且还通过过滤 !$_.PsIsContainer 意味着您正在排除容器级对象 - 在您的情况下,您正在做 获取子项目 在一个 文件系统 提供程序(您可以通过 Get-PsProvider 查看 PowerShell 提供程序),因此容器是 目录信息(文件夹)

PsIs容器 在不同的 PowerShell 提供程序下意味着不同的事物;例如)对于 登记处 提供者,PsIsContainer 是类型 Microsoft.Win32.RegistryKey尝试这个:

>pushd HKLM:\SOFTWARE
>ls | gm

[更新] 对于以下问题: foreach 的作用是什么?那枚举的是什么?要澄清,“ foreach”是“ foreach-object”的别名,您可以通过

get-help foreach

- 或者 -

get-alias foreach

现在在我的回答中,“foreach”正在枚举类型的每个对象实例 文件信息 从先前的管道(已过滤目录)返回。 文件信息 有一个属性叫做 全名 这就是“foreach”所枚举的内容。
并且您通过一个名为“$_”的特殊管道变量引用通过管道传递的对象,该变量的类型为 文件信息 在“foreach”的脚本块上下文中。

对于V1,将以下过滤器添加到您的个人资料中:

filter Get-PropertyValue([string]$name) { 

对于V1,将以下过滤器添加到您的个人资料中:

gci . -r | ?{!

对于V1,将以下过滤器添加到您的个人资料中:

filter Get-PropertyValue([string]$name) { 

对于V1,将以下过滤器添加到您的个人资料中:

<*>

然后你可以这样做:

<*>

顺便说一句,如果您使用的是 PowerShell社区扩展,那么您已经拥有了这个功能。

关于在V2中使用Select-Object -Expand的能力,这是一个可爱的技巧但不明显,实际上不是Select-Object和-Expand的意思。 -Expand就像LINQ的SelectMany一样扁平化,Select-Object是关于将多个属性投影到自定义对象上的。

.$name }

然后你可以这样做:

<*>

顺便说一句,如果您使用的是 PowerShell社区扩展,那么您已经拥有了这个功能。

关于在V2中使用Select-Object -Expand的能力,这是一个可爱的技巧但不明显,实际上不是Select-Object和-Expand的意思。 -Expand就像LINQ的SelectMany一样扁平化,Select-Object是关于将多个属性投影到自定义对象上的。

.psiscontainer} | Get-PropertyName fullname

然后你可以这样做:

<*>

顺便说一句,如果您使用的是 PowerShell社区扩展,那么您已经拥有了这个功能。

关于在V2中使用Select-Object -Expand的能力,这是一个可爱的技巧但不明显,实际上不是Select-Object和-Expand的意思。 -Expand就像LINQ的SelectMany一样扁平化,Select-Object是关于将多个属性投影到自定义对象上的。

.$name }

然后你可以这样做:

<*>

顺便说一句,如果您使用的是 PowerShell社区扩展,那么您已经拥有了这个功能。

关于在V2中使用Select-Object -Expand的能力,这是一个可爱的技巧但不明显,实际上不是Select-Object和-Expand的意思。 -Expand就像LINQ的SelectMany一样扁平化,Select-Object是关于将多个属性投影到自定义对象上的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top