В Microsoft призвали пользоваться PowerShell. СMD продолжит поддерживаться

    image

    Microsoft переводит интерпретатор командной строки cmd.exe в «режим обслуживания». Компания порекомендовала заменить его на PowerShell.

    Как отметил руководитель Windows Terminal Рич Тернер, cmd.exe «не должен использоваться для работы с интерактивной оболочкой».


    «PowerShell — это будущее», — добавил он.


    CMD использовался как оригинальный интерпретатор командной строки по умолчанию в эпоху линейки ОС Windows NT в 90-е гг. Он предоставил администраторам возможность перемещать устаревшие пакетные файлы и сценарии. Разработку cmd.exe свернули после выхода Windows 2000. Однако интерпретатор остается частью современных ОС, в том числе Windows 8, Windows Server 2012 и Windows 10 для обеспечения обратной совместимости. Windows PowerShell стал основной командной оболочкой. Для Windows он вышел в 2006 году, а в 2016 году был открыт исходный код интерпретатора.

    Однако во многих организациях все еще существует множество устаревших сценариев CMD. Перевод в «режим обслуживания» означает, что решение проблем, связанных с интерпретатором, перестает быть основной заботой Microsoft, и компания будет реагировать только на серьезные инциденты.


    Но и с PowerShell существуют проблемы. Перелом может наступить после того, как выйдет PowerShell 7, но пока в Windows работает версия 5.1, которая, как и CMD, находится в режиме обслуживания. Обновлять версию не собираются, пока «не будет устранен разрыв в поддержке LTS между .NET и Windows». То есть, до этого момента Windows будет продолжать использовать и PowerShell, и CMD в режиме обслуживания.
    См. также: «Что такое Windows PowerShell и с чем его едят? Часть 1: основные возможности

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 40

      +3
      Пусть они сначала научат PowerShell хотя бы работать с какой-то адекватной скоростью, а не так как сейчас. Эти две строчки:
      powershell -NoProfile "(Get-ChildItem -LiteralPath '%outp%').CreationTime = (Get-ChildItem -LiteralPath '%inp%').CreationTime"

      powershell -NoProfile "(Get-ChildItem -LiteralPath '%outp%').LastWriteTime = (Get-ChildItem -LiteralPath '%inp%').LastWriteTime"

      всего лишь копируют дату/время создания с одного файла на другой. Процесс занимает порядка 4 секунд. На 4,3 ггц процессоре с достаточным объемом свободной памяти и ssd диском.
      И да, там есть разные танцы с бубном (вот эти вот "-NoProfile" в командах, например), которые позволяют время несколько сократить, раза в 2. Но это все равно адски много для столь простой операции.

      Так что нет, за CMD — будущее
        +5
        В большинстве случаев, работа в командной строке — это не программирование. Простые вещи выполнял всю жизнь в cmd. А с этими конструкциями в PS без пива не разберёшься.
          +1
          Ну мне лень было программу писать, чтобы эту операцию переноса дат с файла на файл делать. А встроенной в cmd команды для работы с датами или хотя бы какой-то консольной утилиты в винде до сих пор нет. Пришлось вот на PS извращаться. Причем меня поразило даже не то, что команды для PS круче кода на Haskell'е, а то, что в 2020 году они ТОРМОЗЯТ!

          Ну и да — PS явно под синтетическими наркотиками делали…

          МС последнее время вообще считает, что если народ так любит командную строку — надо туда команды подлиннее запихнуть. Они всё так же не интуитивны, догадаться, какой параметр будет, не гугля — почти невозможно, при этом любой процесс описывается тремя-четырьмя последовательными командами с этими длиннющими параметрами. Достаточно хотя бы посмотреть, как прописывается через консоль загрузчик на нужный раздел и добавляется в меню выбора при загрузке. Зачем это все так извращённо сделано — я до сих пор понять не могу. Как-будто в МС засели любители юниксов, но самую важную часть про короткие консольные команды им в детстве никто не рассказал…
            0
            Немного оффтоп, в bash тоже не все гладко, это и замысловатые конструкций if, case/esac, работа с массивами… Для себя выбрал nodejs, если что-то выходит за адекватные границы для команд, в самом деле, ощущение, что обкуренные программисты все это писали
              0
              Эм, что не интуитивно в if/case в баше? Там все весьма очевидно и понятно.
              +3
              Они всё так же не интуитивны, догадаться, какой параметр будет, не гугля — почти невозможно

              JFYI


              Имя-Команды -?
              help *ключевое_слово*

              Как-будто в МС засели любители юниксов, но самую важную часть про короткие консольные команды им в детстве никто не рассказал…

              Get-Alias
                0
                Ну-ну. Что help, что Get-Alias в современных консольных утилитах от МС — это мёртвому припарки, проблема не в длине команд (это фигово, но с этим можно жить). Проблема в том, что для ЛЮБОЙ операции надо отдавать десятки этих длинных команд, последовательно. И вот в этом и жесть.

                Ну вот, например, зацените по ссылке инструкцию. Начните с подраздела «Пересоздание BCD файла загрузчика Windows 10».

                И вот просто прикиньте, как вы ВОТ ЭТО будете делать используя только встроенную в утилиты справку -help. Без гугла, ага. Это просто нереально, даже если бы справка выдавалась развернутая, а не в одно предложение.

                P.S.: чтобы было понятнее, о чем я — во времена WinXP эти действия выполнялись ОДНОЙ командой и редактированием .ini-файла в блокноте. А не вот этой вот жестью в 13 последовательных вызовов одной и той же утилиты с разными параметрами
                  0

                  Я не вижу там вообще powershell

                    +1
                    Ну мы же вроде бы переключились на обсуждение, что длинные команды — плохо, но можно обойти?

                    Ну а про PowerShell если говорить, то каким-таким способом без гугла я бы смог добраться до конструкции (Get-ChildItem -LiteralPath '%outp%').CreationTime?

                    Ну т.е. вот возьмем cmd: большая часть команд или встроенная, или — внешние утилиты, которым дофига лет уже. Все эти команды — выдают вполне доступные справки, большая часть из них делают ВСЕ нужные операции в одном вызове. Современное решение от МС: узнать какие команды есть — можно встроенной справкой, которая никак не объясняет, зачем эти команды нужны. Справка по каждой конкретной команде так же никак не помогает понять что это и зачем. Половина параметров или без справки или изначально — составная часть других параметров и применяется только совместно. Встроенной справки на соотв. сочетания параметров — нет. Любая полезная инфа — только гуглится, т.к. справка на сайте МС в общем случае примерно так же полезна, как и встроенная.

                    В общем, использовать это всё «очень удобно».
                      0

                      А как вы без гугла добрались бы до команды dir?
                      Можно help Get-* узнать все команды которые что, что получают
                      Про параметры есть справка (наберите help dir или dir -?)


                      Или intellisence.


                      Свойства есть в intellisense или ls | gm


                      Просто нужно несколько базовых приемов работы знать. Попробуйте логически понять как вы разобрались с командами cmd — скорее всего гуглили.


                      А сейчас есть powershell_ise с intellisense и справка в которой есть поиск и способ изучить структуру выхлопа при помощи gm

                        0
                        Если запустить CMD и набрать там help, то он, в общем-то все команды там перечисляет. Если я правильно помню, то вообще это так работало еще со времен ms-dos.

                        Ну вот вам самому не кажется, что наличие intellisense в PS — это как бы сами разработчики расписались в том, что они сделали настолько плохо, что без подсказок с этим уже как бы и нельзя нормально работать?

                        И это, замечу, мы еще не касались модулей расширения самого PS и системы внешних скриптов, которые можно скачать и установить для расширения функционала.

                        Я честно не представляю человека, который в это вот всё полезет добровольно. Искренне жалко профессиональных сисадминов, которым с этим приходится жить и работать.
                          0
                          Ну вот вам самому не кажется, что наличие intellisense в PS — это как бы сами разработчики расписались в том, что они сделали настолько плохо, что без подсказок с этим уже как бы и нельзя нормально работать?

                          Нет. Просто с подсказками удобнее чем без подсказок.


                          Я честно не представляю человека, который в это вот всё полезет добровольно.

                          Он удобнее чем CMD только тормознее.

                    0
                    Проблема в том, что для ЛЮБОЙ операции надо отдавать десятки этих длинных команд, последовательно.
                    Ну, во-первых, это неправда — множество операций выполняется куда меньшим количеством команд, а, во-вторых, можно подумать, в линуксах вы без гугла или обширного опыта последовательность команд для увеличения размера диска отгадаете.

                    даже если бы справка выдавалась развернутая
                    Используйте help с ключом -detailed
                • UFO just landed and posted this here
                +4

                Ага, 4 сек выполнения к минуте набора команд со всеми этими -getCloserDateToDateOfFolderCreationIfItNotAThursday
                Как это вообще можно запомнить?


                «PowerShell — это будущее», — добавил он.

                А я-то думал что в терминаторе самое ужасное будущее...

                  0

                  Нет насущной необходимости прям запоминать. Если ты знаешь, как конструируется имя командлета, ты и сам его в уме можешь предположить и дальше уточнить через get-command.
                  В линуксовом cli каждый, кто создавал какой-либо бинарник, придумывал имя, такое ощущение, с единственной целью — быть непохожим на других. Тут только запоминать либо гуглить. Даже man -k не всегда спасает.

                  +1

                  Падажжи. То есть ты серьёзно хочешь всю эту объектную модель powershell'а (которая будет работать в однострочниках, без всяких доп. команд импорта), но при этом на каждой итерации запускаешь отдельный инстанс powershell, и считаешь, в общем-то время запуска инстанса, а не исполнения конечной команды?

                    0
                    Ну, во-первых, bat-файл тоже запускает новый инстанс cmd. Это ему совершенно не мешает работать быстро. Даже если он использует внешние консольные утилиты, а не (уже) встроенные, типа date, attr и т.п.

                    А во вторых, нужную мне задачу не получилось реализовать в рамках одной команды, не смотря на всю эту объектную модель. Что, кстати, тоже хорошо показывает качество разработки этого самого PS.

                    Ну и в третьих, сам cmd запускается мгновенно, а ps — минимум за 2 секунды. Когда я гуглил в попытках как-то это всё ускорить до разумного времени, выяснилось забавное: в целом скорость запуска PS колеблется от 1,5 до 8 секунд. Причем скорость на разных компьютерах — разная, как повезет. В некоторых случаях можно применить разные шаманские пляски и/или ngen, чтобы ускорить процесс. Но это все равно 1,5 секунды на старт — минимум. А cmd — мгновенно. И я выберу cmd, при прочих равных.

                    Upd: ну и да, я в упор не понимаю, зачем тащить ВСЮ объектную модель и ссылки на внешние сборки в скрипт, который не будет их использовать. Почему оно использует аж 32 мб оперативки если я хочу, например, посмотреть текущую дату в консоли? При этом оно еще проверяет права доступа, учитывает профиль под которым запущено и еще миллион приседаний — и все это, чтобы вывести мне дату по запросу. Ага.
                    Почему бы это всё не подгружать по мере необходимости-то? Зачем тащить сразу и всё в процесс, если оно там в большом количестве сценариев никогда не будет использоваться?
                      0

                      core i7 2.8ghz, SSD, оперативы предостаточно, при этом прямо сейчас куча всего запущена, но увидев цифры я даже не стал заморачиваться с закрытием.


                      Схожий с вашим кусок кода
                      Measure-Command { 
                          powershell -NoProfile "(Get-ChildItem -LiteralPath 'file.txt').CreationTime = (Get-ChildItem -LiteralPath 'file2.txt').CreationTime"
                      }
                      
                      Measure-Command { 
                          (Get-ChildItem -LiteralPath 'file.txt').CreationTime = (Get-ChildItem -LiteralPath 'file2.txt').CreationTime
                      }
                      

                      Вывод:


                      PS D:\Dev\> .\test.ps1
                      
                      Days              : 0
                      Hours             : 0
                      Minutes           : 0
                      Seconds           : 0
                      Milliseconds      : 267
                      Ticks             : 2673650
                      TotalDays         : 3.09450231481481E-06
                      TotalHours        : 7.42680555555556E-05
                      TotalMinutes      : 0.00445608333333333
                      TotalSeconds      : 0.267365
                      TotalMilliseconds : 267.365
                      
                      Days              : 0
                      Hours             : 0
                      Minutes           : 0
                      Seconds           : 0
                      Milliseconds      : 11
                      Ticks             : 114739
                      TotalDays         : 1.32799768518519E-07
                      TotalHours        : 3.18719444444444E-06
                      TotalMinutes      : 0.000191231666666667
                      TotalMilliseconds : 11.4739

                      Или вот ещё
                      Measure-Command { 
                          powershell -NoProfile "Write-Host 'Hello'"
                      }
                      
                      Measure-Command { 
                          Write-Host 'Hello'
                      }

                      Вывод:


                      Days              : 0
                      Hours             : 0
                      Minutes           : 0
                      Seconds           : 0
                      Milliseconds      : 309
                      Ticks             : 3095771
                      TotalDays         : 3.58306828703704E-06
                      TotalHours        : 8.59936388888889E-05
                      TotalMinutes      : 0.00515961833333333
                      TotalSeconds      : 0.3095771
                      TotalMilliseconds : 309.5771
                      
                      Hello
                      Days              : 0
                      Hours             : 0
                      Minutes           : 0
                      Seconds           : 0
                      Milliseconds      : 17
                      Ticks             : 178523
                      TotalDays         : 2.06623842592593E-07
                      TotalHours        : 4.95897222222222E-06
                      TotalMinutes      : 0.000297538333333333
                      TotalSeconds      : 0.0178523
                      TotalMilliseconds : 17.8523

                      Всё ещё не понимаю о каких 1.5 — 8 сек речь.


                      ну и да, я в упор не понимаю, зачем тащить ВСЮ объектную модель и ссылки на внешние сборки в скрипт, который не будет их использовать

                      Не "ВСЮ". И для того, чтобы ваш скрипт смог оставаться однострочным для простейших системных операций и структур данных, и не содержал в себе кучу импортов. Сторонние модули / сборки вы всё ещё способны подгрузить когда нужно.
                      По такой логике можно было бы в скорость работы скрипта ещё и приплюсовать время загрузки винды, ведь без неё powershell не работает.


                      Конкретно по вашей ситуации — можно же написать цикл на том же powershell, передавая в обрабатывающий скрипт собранный результирующий список файлов (пайпом, или промежуточной выгрузкой в файл)

                        0
                        Ну я писал выше — скорость сильно зависит от внешних к PowerShell'у причин. Т.е. проблемы чаще в винде, чем в PS. Однако, если вы таки погуглите, то увидите, что вопрос времени старта PS — очень актуальный и народ постоянно с этим сталкивается, как только дело доходит до массовой обработки чего-либо, а не единичного вызова.

                        Ну т.е. вот в моем примере — я обрабатываю один файл, поэтому задержки могу как-то потерпеть, эти команды — завершающий этап более длительного процесса, поэтому на общем фоне скорость уже не сильно критична. Но если бы таких файлов было несколько сотен — то это уже минуты потерянного неизвестно где времени.
                    –2

                    PS тормозит по простой причине — она на C#.

                      +1
                      Но далеко не все приложения на C# тормозят!
                        0

                        Тут имеется ввиду время старта.

                          +1
                          Так и я про то же. Время старта сильно зависит от подключаемых внешних сборок, да и то, хоть как-то оно заметно было во времена дотнета первой-второй версии, сейчас уже на фоне роста производительности железа это все не существенные величины.

                          Просто PS занимается кучей вещей на старте. Знаете, почем в моем примере команд "-NoProfile" написано? Потому что иначе PS подгружает инстанс того профиля под которым запускается, с соответствующими проверками на безопасность, права доступа и все остальные приседания, что и занимает минимум 2 сек на неслабом железе. И это только малая часть того, что там на старте происходит, достаточно погуглить как люди с проблемой задержек на старте борются. Это, наверное, вообще топовая тема вокруг PS — и C# тут, в общем-то, ни при чем.
                            0

                            Наверное, подразумевается что чаще вы будете запускать powershell и в нем что-то делать а не апускать каждый раз отдельную команду и покидать и тогда вам потребуется профиль чтобы написать туда всяких удобных фукнций и команд

                    +1
                    Т.е. получается, что PowerShell будет проходить всё то, что сейчас делает десятка? Постоянные апдейты, патчи, патчи патчей — то, о чём сейчас выходят все новости про Windows. О стабильности можно будет забыть? Так это вроде главная фишка винды была долгое время, из-за которой те же игры на неё выпускать было проще.
                      0
                      В Linux примерно та же ситуация, еженедельный apt-get update\upgrade приносит много нового. И уж лучше так, чем годами сидеть в застое с одними и теми же багами см. VBA
                        0
                        при этом шелл в Линукс обратно совместим и не страдает нестабильностью десятки лет
                          0
                          В основном обновляется несистемный софт и изредка ядро и какие-то важные библиотеки. При этом можно в любой момент откатиться на предыдущее ядро, если вдруг что-то перестало работать.
                        +2
                        мб WSL2 bash?
                          0

                          я так и не смог себя заставить использовать wsl и баш для работы с виндой, не знаю почему
                          как по мне, чем нативнее тулзы, тем лучше

                            +1
                            тут скорее смотря для чего используете. Если ты администратор зоопарка win-машинок, и тебе нужно писать скрипты, трогающие самые дебри windows, то да, powershell это твой инструмент. Опять же, тут он не является заменой cmd т.к. для этого cmd не подходит.

                            А если ты простой разработчик, которому время от времени нужен терминал для пары команд, то тут баш будет объективно удобнее.
                              +1

                              Зависит от разработчика. Для .NET разработчика posh очень удобен тем, что можно использовать свои знания и инструменты там — весь фреймворк нативно доступен.


                              Возможно, для веб разработчика баш удобнее тем, что с ним все равно знаком по серверному линуксу.

                          0
                          Powershell слишком раздутый. Ей богу лучше бы Lua встроили или что-то похожее.
                          просто сложные вещи на PowerShell делать не будешь, а для простых должны быть простые инструменты.
                            0

                            У вас мало опыта с posh, предположу. Он вроде годится и для простых и для сложных вещей. Просто другая идеология использования, чем в том же bash.

                            +1

                            Лучше бы они здравый смысл призвали. Одно только порождение оболочки занимает пару секунд, а выговаривая название команд PS можно случайно дьявола призвать.

                              –1

                              Зато эти команды не обязательно зубрить, как в bash.

                                0

                                а в баше надо зубрить? и в pwsh все само пишется? с завтрашнего дня перехожу на pwsh

                              0
                              CMD использовался как оригинальный интерпретатор командной строки по умолчанию в эпоху линейки ОС Windows NT в 90-е гг

                              Разве не в эпоху всей линейки MS продуктов включая windows 3, и ДОС?

                              А хотя, в дос был command.com… но в винде cmd был еще до НТ
                                0
                                До NT, если мне не изменяют память и понимание, он назывался «Сеанс MS-DOS», и предоставлял интерфейс к тому же самому command.com, просто следующей, седьмой версии.
                                А cmd — это вроде бы уже нтшное приложение.

                              Only users with full accounts can post comments. Log in, please.