Как определить, нахожусь ли я в powershell или cmd?

Я играл с OpenSSH в Windows, и похоже, что обычные псевдонимы Unix отсутствуют. Я не уверен, запускает ли он powershell или cmd, когда я вхожу в систему Windows через SSH. Как правильно увидеть текущую запущенную оболочку в Windows?


person mikemaccana    schedule 26.12.2015    source источник
comment
Любопытно, каким может быть лучший ответ. Я думаю, что это может быть сложно найти чистый способ сделать это. Я имею в виду, что пока вы этим занимаетесь, вы также можете спросить, работаете ли вы на Ruby или Python. PowerShell и cmd на самом деле несопоставимы. PowerShell основан на .net, и его сходство с cmd облегчает переход для людей, которые раньше использовали пакетную команду cmd.   -  person Matt    schedule 27.12.2015
comment
@PetSerAl Это не работает, если профиль переопределяет dir для вызова команды dir cmd.exe (что делает мой профиль). Но тем не менее это довольно умно.   -  person Χpẘ    schedule 27.12.2015
comment
@ user2460798 Надеюсь, вы не переопределяете type или echo: (type 2>&1 -ea ig .|echo CMD);&<# rem #>echo PowerShell   -  person user4003407    schedule 27.12.2015


Ответы (2)


Все заслуги принадлежат PetSerAl, это должно было быть опубликовано как ответ:

(dir 2>&1 *`|echo CMD);&<# rem #>echo PowerShell

Внутри Win32-OpenSSH эта команда также работает и выводит CMD.

NB: Win32-OpenSSH кажется немного ограниченным, cd не распознается в моей системе.

person sodawillow    schedule 27.12.2015
comment
К сожалению, этот трюк не работает с PowerShell 6+, если кто-то хочет определить, является ли это powershell.exe или pwsh.exe :( - person Marcus Ottosson; 16.07.2019
comment
Разве я не могу просто выполнить специальную команду Powershell, если она работает, то это Powershell, иначе CMD? как $PROFILE или ls - person Rajan; 21.04.2021

Я хотел бы расширить ответ @sodawillow, чтобы также различать использование Powershell (powershell.exe), известного как Desktop, и PWSH (pwsh.exe), известный как Core.

(dir 2>&1 *`|echo CMD);&<# rem #>echo ($PSVersionTable).PSEdition
# Returns one of: CMD, Core, Desktop

Это работает во всех случаях, когда вложенная оболочка не создается. Это означает, что он не работает при открытии подпроцесса по умолчанию в Python, поскольку он всегда использует CMD при взаимодействии с окнами. На самом деле это устанавливается переменной среды Windows: ComSpec всегда указывает на C:\Windows\system32\cmd.exe.

Например:

(Запуск интерпретатора Python из оболочки pwsh.)

>>> import os, subprocess
>>> c="(dir 2>&1 *`|echo CMD);&<# rem #>echo($PSVersionTable).PSEdition"
>>> subprocess.call(c,shell=True)
CMD

Другие схемы обнаружения оболочки Python см. в этой полезной публикации.


ОБНОВЛЕНИЕ: 01.05.2020

Мне удалось заставить вышеприведенное работать, но с неприятным побочным эффектом всегда загружать профиль powershell перед выполнением. Хитрость заключалась в том, чтобы указать execute=<path-to-powershell-exe> следующим образом:

(Запустите интерфейс командной строки Python.)

import os, subprocess
c="(dir 2>&1 *`|echo CMD);&<# rem #>echo($PSVersionTable).PSEdition"
e="C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe"
subprocess.call(c, shell=True, executable=e)

# output:
# <blah blah from profile>
# Desktop
# 0

Мне не удалось обойти проблему с профилем powershell. Но очевидно над этим что-то работает. См. здесь и здесь.

person not2qubit    schedule 27.04.2020
comment
Отличный ответ! Обратите внимание, что «ядро» больше не существует со времен Powershell 7. Это просто «Windows Powershell» и «Powershell». - person mikemaccana; 28.04.2020
comment
@mikemaccana Интересно и, возможно, хорошо. Но он все равно возвращает Core... - person not2qubit; 29.04.2020
comment
@mikemaccana Мне удалось сделать еще один шаг, но я не могу избежать загрузки профиля. Также в самом конце вывода есть загадочная цифра 0. - person not2qubit; 01.05.2020