我有一个包含三个文件的文件夹,并希望在PowerShell中等效dir /s /b
。我该怎么做?
例如,如果文件夹名称为temp3
,并且它包含三个文本文件 - a.txt
。 b.txt
和c.txt
,正在做
C:\temp3> dir /s /b
给了我
C:\temp3\a.txt
C:\temp3\b.txt
C:\temp3\c.txt
如何在PowerShell中获得相同的结果?
答案 0 :(得分:28)
如果您使用Powershell作为shell(而不是脚本处理器),只需键入:
cmd /r dir /s /b
/r
标志告诉cmd.exe
运行命令并退出。换句话说,您将以相同的执行上下文结束。
对于许多命令,cmd /r
优于处理Powershell面向对象的体系结构。
答案 1 :(得分:27)
您可以使用
Get-ChildItem -Recurse | Select-Object -ExpandProperty FullName
gci -r | select -exp FullName
或
Get-ChildItem -Recurse | ForEach-Object { $_.FullName }
gci -r | % { $_.FullName }
gci -r | % FullName # In recent PowerShell versions
(长版本是第一个,缩短使用别名和短参数名称是第二个,如果它不明显。在脚本中我建议使用长版本,因为它不太可能在某个地方发生冲突。 )
重新阅读您的问题,如果要使用dir /s /b
完成所有操作,则输出当前目录中文件的完整路径,则可以在此处删除-Recurse
参数。
我给你的建议是:当你可以提供帮助时,不要使用字符串。如果您想传递文件,只需从FileInfo
获取Get-ChildItem
对象。 cmdlet知道如何处理它。将字符串用于对象更好地工作的东西只会让你陷入奇怪的问题。
答案 2 :(得分:5)
只是强制执行,乔伊说:
gci -r -filter *.log | % fullname
这可以找到像dir /s/b *.log
这样的文件。
(dir -r *.log).FullName
同样适用
在您的powershell shell中执行一次,以启用dirsb *.log
命令:
function global:dirsb {
param ([Parameter(Mandatory=$true)][string]$fileFilter)
gci -r -filter $fileFilter | % fullname
}
或将其添加到您的个人资料中:PS> notepad $profile
答案 3 :(得分:2)
如果您只是想通过调用cmd dir永久替换Powershell的dir别名(Get-ChildItem),那么对于将要打开的所有未来PowerShell窗口,只需执行以下操作:
文件打开时,插入以下行并保存:
Remove-Item alias:\dir
function dir($1, $2, $3, $4) {cmd /r dir $1 $2 $3 $4}
答案 4 :(得分:0)
这等效于:
(dir -r).FullName
答案 5 :(得分:0)
Bob答案的一种变化是使用管道进行实时输出(在大型目录中具有更好的反馈):
dir -r | % FullName