Powershell导航到特定目录

时间:2020-08-27 11:19:31

标签: powershell

总的Powershell新手正在尝试进入目录。我知道这是最后一个目录(按字母顺序),我可以用

Get-ChildItem -Directory | Select-Object -Last 1

然后我想Set-Location,但是我不知道如何用上面的输出来调用它。

我正在尝试类似的事情:

Get-ChildItem -Directory | Select-Object -Last 1

Set-Variable -Name "Dir" -Value { Get-ChildItem -Directory | Select-Object -Last 1 }

Set-Location -Path $Dir

但这根本不起作用。有指针吗?

1 个答案:

答案 0 :(得分:3)

评论中有很多信息,让我尝试对其进行总结和补充:

  • { ... }是PowerShell中的script block文字:使用&,{{3} };也就是说,花括号中的内容是立即执行。

  • 鉴于您要执行并返回命令的输出作为另一个命令的参数,请使用()call operator [ 1]

Set-Variable -Name Dir -Value (Get-ChildItem -Directory | Select-Object -Last 1)

但是,鉴于简单的分配-$Dir = ...也可以工作,因此几乎不需要使用grouping operator cmdlet,在这种情况下,您甚至都不需要括号:

$Dir = Get-ChildItem -Directory | Select-Object -Last 1

当然,就像您可以将(...)表达式传递给Set-Variable一样,您也可以将其直接传递给Set-Variable,在这种情况下,您根本不需要中间变量(在位置上隐含参数-Path):

Set-Location (Get-ChildItem -Directory | Select-Object -Last 1)

您可以通过直接索引 Get-ChildItem调用的输出 [2] 来使其更加简洁。 [-1]引用 last 数组元素(输出对象):

Set-Location (Get-ChildItem -Directory)[-1]

替代方法是使用管道(请参见Set-Location):

Get-ChildItem -Directory | Select-Object -Last 1 | Set-Location

请注意,如果当前目录中没有 子目录(这意味着Get-ChildItem -Directory不产生任何输出),则后三个命令之间会有细微的差别:

  • Set-Location (Get-ChildItem -Directory | Select-Object -Last 1)将报告一个错误,因为您随后将有效地传递了$null作为-Path参数。

  • Set-Location (Get-ChildItem -Directory)[-1]也将报告错误,因为您无法将索引应用于$null值。

  • 相比之下,
  • Get-ChildItem -Directory | Select-Object -Last 1 | Set-Location将是 no-op ,因为Set-Location实际上根本不会被调用,因为没有通过接收输入管道。

如果没有子目录是意外情况,则可以通过在前两个命令之一中添加-ErrorAction Stop来强制脚本中止-请参阅about_Pipelines


[1]尽管$(...)about_CommonParameters)也可以工作,但通常没有必要-请参见subexpression operator

[2]请注意,这样做意味着Get-ChildItem调用的所有输出随后都将首先收集到内存中,但是在这种情况下这不太可能成为问题。有关更多信息,请参见this answer