如何将PowerShell命令输出用于后续命令:跳转至目标文件目录
PowerShell 跨驱动器搜索文件并获取目标目录用于后续操作
问题背景
作为PowerShell新手,我编写了跨驱动器搜索特定文件的命令:
$ExclDrives = ('C') Get-PSDrive -PSProvider FileSystem | Where-Object {$_.Name -notin $ExclDrives} ` | % {write-host -f Green "Searching " $_.Root;get-childitem $_.Root -include *MyFile.txt -r ` | sort-object Length -descending}
命令输出结果:
Searching D:\ Searching E:\ Searching F:\ Directory: F:\MyDirectory Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 8/13/2022 12:03 AM 0 MyFile.txt PS C:\Windows\system32>
我希望获取输出中文件所在的目录(比如F:\MyDirectory),并用于后续命令(例如cd F:\MyDirectory),请问能否通过管道等方式实现?
解决方案
可以通过提取Get-ChildItem返回的文件对象的目录属性,结合管道或变量实现需求,以下是几种可行的方式:
方式1:提取目录并切换(单目标)
$ExclDrives = ('C') # 搜索文件并提取第一个匹配文件的目录 $targetDir = Get-PSDrive -PSProvider FileSystem | Where-Object {$_.Name -notin $ExclDrives} | ForEach-Object { Write-Host -f Green "Searching " $_.Root Get-ChildItem $_.Root -Include *MyFile.txt -Recurse | Sort-Object Length -Descending } | Select-Object -ExpandProperty DirectoryName -First 1 # 如果找到目录则切换 if ($targetDir) { Set-Location $targetDir # Set-Location 是 cd 的PowerShell原生命令 }
方式2:用管道直接传递目录切换
$ExclDrives = ('C') Get-PSDrive -PSProvider FileSystem | Where-Object {$_.Name -notin $ExclDrives} | ForEach-Object { Write-Host -f Green "Searching " $_.Root Get-ChildItem $_.Root -Include *MyFile.txt -Recurse | Sort-Object Length -Descending } | Select-Object -ExpandProperty DirectoryName -First 1 | Set-Location
方式3:处理多个匹配目录
如果搜索到多个目标文件,可收集所有唯一目录并逐个处理:
$ExclDrives = ('C') # 获取所有匹配文件的唯一目录 $allTargetDirs = Get-PSDrive -PSProvider FileSystem | Where-Object {$_.Name -notin $ExclDrives} | ForEach-Object { Write-Host -f Green "Searching " $_.Root Get-ChildItem $_.Root -Include *MyFile.txt -Recurse | Sort-Object Length -Descending } | Select-Object -ExpandProperty DirectoryName -Unique # 遍历目录执行后续操作 foreach ($dir in $allTargetDirs) { Write-Host "Processing directory: $dir" Set-Location $dir # 这里添加你的后续命令 }
关键说明
Get-ChildItem返回的是FileInfo对象,其中DirectoryName属性直接存储了文件所在的完整路径。- 避免过度依赖
Write-Host:它仅输出到控制台,不会将对象传入管道,若需要日志式输出,可改用Write-Verbose并加上-Verbose参数启用。 Set-Location是PowerShell中切换目录的原生命令,cd是它的别名,功能完全一致。
内容的提问来源于stack exchange,提问作者DirtyEggWater
相关产品推荐
相关产品推荐

