总的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
但这根本不起作用。有指针吗?
答案 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。