Как использовать трубу cmd (/ piping) в PowerShell? - PullRequest
2 голосов
/ 15 марта 2011

В cmd (и bash) канал "|" передает вывод другой команде в исходном формате вывода первой команды (в виде строки).

В PowerShell все, что выходит из каналаявляется объектом (даже строка является строковым объектом).

Из-за этого некоторые команды не выполняются при запуске в командном окне PowerShell, а не в командном окне Windows.

Пример:

dir c:\windows | gzip > test.gz

Когда эта команда запускается в окне командной строки Windows, она работает правильно - список каталогов C: \ windows сжимается в файл test.gz.

Сбой той же команды в PowerShellпотому что PowerShell не использует канал стиля cmd и заменяет его каналом PowerShell (работа с массивом элементов файловой системы).

Q. Как отключить поведение конвейера по умолчанию в PowerShellзаставить традиционные команды Windows работать одинаково в PowerShell?

Я пытался использовать escape-символ "`" перед каналом "`|", но он не работал,Я тоже попробовал invoke-expression -command "command with | here", но тоже не получилось.

Ответы [ 4 ]

6 голосов
/ 16 марта 2011

если вы хотите отправлять строки по конвейеру, вы можете использовать командлет "out-string"

Например:

get-process | out-string

Если вы специально ищете способ архивации файлов в PowerShell, ознакомьтесь с расширениями сообщества PowerShell. Есть несколько командлетов для архивирования и разархивирования всех типов файлов.

http://pscx.codeplex.com

4 голосов
/ 16 марта 2011

Если вы можете передать вывод (CMD) dir в gzip, то gzip, очевидно, знает, как анализировать вывод dir. Вывод (строки) из команды PowerShell dir (иначе называемой Get-ChildItem) не выглядит одинаково, поэтому gzip, скорее всего, не сможет его проанализировать. Но я также предположил бы, что gzip будет рад составить список путей, поэтому это, вероятно, сработает:

dir c:\windows | select -ExpandProperty FullName | gzip > test.gz

Нет гарантий, явных или подразумеваемых.

0 голосов
/ 30 августа 2018

Если вам действительно нужно использовать конвейерную систему DOS старой школы в PowerShell, это можно сделать, запустив команду в отдельном временном сеансе DOS:

& cmd /c "dir c:\windows | gzip > test.gz"

Переключатель /c указывает cmd выполнить команду и выйти. Конечно, это работает только в том случае, если все команды представляют собой DOS старой школы - их нельзя сочетать с командами PowerShell.

Хотя есть примеры PowerShell для примера, приведенного в этом вопросе, есть много программ DOS, которые используют старую систему каналов и не будут работать в PowerShell. svnadmin load это то, с чем мне приятно иметь дело.

0 голосов
/ 16 марта 2011

Вы не можете. PowerShell был разработан для передачи объектов по конвейеру, а не текста. Для DOS нет режима обратной совместимости.

...