Как мне сделать "dir/s/b" в PowerShell?
У меня есть папка с тремя файлами и требуется эквивалент dir /s /b
в PowerShell. Как это сделать?
Например, если имя папки 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?
Ответы
Ответ 1
Вы можете использовать
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
. Командлеты знают, что с ним делать. Использование строк для вещей, где объекты работают лучше, просто приводит вас к странным проблемам.
Ответ 2
Если вы используете Powershell в качестве оболочки (а не как процессор script), вы можете просто ввести:
cmd /r dir /s /b
Флаг /r
сообщает cmd.exe
выполнить команду и выйти. Другими словами, вы закончите в том же контексте выполнения.
Для многих команд cmd /r
лучше, чем иметь дело с объектно-ориентированной архитектурой Powershell.
Ответ 3
Добавление в ответ Джой. Начиная с PowerShell 3.0, вы можете использовать стенографию Foreach-Object
, чтобы получить свойство FullName
.
Get-ChildItem -Recurse | Foreach-Object FullName
gci -r |% FullName
Разница в том, что вам не нужно использовать фигурные скобки ({}
) или переменную $_
, если все, что вам нужно, является свойством.
Ответ 4
просто для обеспечения того, что сказал Джои:
gci -r -filter *.log | % fullname
работает, чтобы найти файлы типа dir /s/b *.log
.
Ответ 5
Если вы просто хотите надолго заменить псевдоним Powershell dir (Get-ChildItem) на вызов cmd-dir, для всех будущих окон PowerShell, которые вы собираетесь открыть, просто выполните следующие действия:
- notepad $profile (из окна PowerShell)
-
когда файл открывается, вставьте следующие строки и сохраните:
Remove-Item alias:\dir
function dir($1, $2, $3, $4) {cmd /r dir $1 $2 $3 $4}