Подтвердить что ты не робот

Как мне сделать "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?

4b9b3361

Ответ 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}