Как создать постоянные псевдонимы PowerShell

143

Я хочу создать aliasобъект cmdlet, срок действия которого не истекает после закрытия текущего сеанса Powershell, допустим, у меня есть этот псевдоним:

C:\Users\Aymen> New-Alias Goto Set-Location

Это прекрасно создает Gotoпсевдоним, но я хочу использовать его даже после закрытия текущего сеанса, как мне этого добиться.

Примечание:

Справочная система PowerShell предлагает мне экспортировать созданные мной псевдонимы и импортировать их в следующий раз, когда я открою новый сеанс, на самом деле это не совсем то, что я ищу, есть ли прямой и понятный способ сохранить псевдоним после того, как я создать его через разные сессии

AymenDaoudi
источник
ИМО тебе гораздо лучше ставить скрипты в PATH. Таким образом, команда будет доступна мгновенно для всех ваших открытых оболочек, и если вы ее измените, это изменение будет распространяться на все последующие использования без перезагрузки $ profile или чего-то еще.
masterxilo

Ответы:

112

ОБНОВЛЕНО - январь 2017

В profile.ps1файле можно хранить любой код powershell, который будет выполняться при каждом запуске powershell. Существует как минимум 6 различных путей хранения кода в зависимости от того, какой пользователь должен его выполнить. Мы можем рассмотреть только 2 из них: пути «все пользователи» и «только ваш пользователь».

Таким образом, чтобы ответить на ваш вопрос, вам нужно всего лишь создать profile.ps1файл, содержащий код, который вы хотите выполнить, то есть

New-Alias Goto Set-Location

и сохраните его на правильном пути:

  • "$Home\Documents" (C: \ Users \ ваше имя \ Documents): только ваш пользователь будет выполнять код.
  • $PsHome (C: \ Windows \ System32 \ WindowsPowerShell \ v1.0): каждый пользователь выполнит код.

Чтобы применить изменения, закройте все открытые экземпляры PowerShell и перезапустите их.

ЧАЕВЫЕ

  • Если оба пути содержат profile.ps1 файл, сначала выполняется весь пользовательский, а затем пользовательский.

  • Всегда помещайте код в пользовательский профиль, если нет необходимости расширять его выполнение для каждого пользователя. Вам не нужны права администратора, чтобы добавить файл в свое пространство пользователя (иначе вы делаете это), и вы не загрязняете пространство других пользователей.

  • ПОМНИТЕ! $PsHomeПуть отличается от 32 - битных и 64 - битных экземпляров PowerShell, так что вы должны учитывать и окружающую среду , если вы хотите всегда , чтобы выполнить код профиля. Обычно пути C:\Windows\System32\WindowsPowerShell\v1.0для 64-битной среды и C:\Windows\SysWow64\WindowsPowerShell\v1.0для 32-битной.

Naigel
источник
9
без ошибок это просто не работает, я не уверен, если это проблема с разрешениями. Я действительно заставил это работать (я должен я прокомментировал ранее). Мне пришлось создать папку, \Users\{ME}\Documents\WindowsPowerShellа затем добавить Microsoft.PowerShell_profile.ps1не другие пути работает для меня.
2
Согласно связанной статье использование "$HOME\Documents\WindowsPowerShell"и именование Microsoft.PowerShell_profile.ps1ограничивают область не-ISE и текущим хостом, но не должны быть вопросом разрешений (то же самое из "$Home\Documents\profile.ps1" should apply). Может быть, это не так, я попробую, спасибо за информацию
Найджел
2
Привет @ Найджел, я должен использовать этот подход, чтобы заставить его работать: superuser.com/questions/516700/… итак, окончательное решение для меня было создать файл для профиля: New-Item -path $profile -type file -forceкоторый создал папку и файлDocuments\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
Eagle
57
Лучший способ получить местоположение профиля - это запустить "echo $ profile" в вашем окне powershell.
Рахул Джа
2
Не забудьте сделать резервную копию файла profile.ps1, поскольку Windows Creators Update, похоже, удаляет файл в его расположении по умолчанию !!
Гулим
109

Не стоит добавлять подобные вещи прямо в ваш $env:WINDIR папки PowerShell.
Рекомендуется добавить его в свой личный профиль:

cd $env:USERPROFILE\Documents
md WindowsPowerShell -ErrorAction SilentlyContinue
cd WindowsPowerShell
New-Item Microsoft.PowerShell_profile.ps1 -ItemType "file" -ErrorAction SilentlyContinue
powershell_ise.exe .\Microsoft.PowerShell_profile.ps1

Теперь добавьте свой псевдоним в файл Microsoft.PowerShell_profile.ps1, который теперь открыт:

function Do-ActualThing {
    # do actual thing
}

Set-Alias MyAlias Do-ActualThing

Затем сохраните его и обновите текущий сеанс:

. $profile

Примечание: на всякий случай, если вы получите разрешение, например

CategoryInfo: SecurityError: (:) [], PSSecurityException + FullyQualifiedErrorId: UnauthorizedAccess

Попробуйте команду ниже и обновите сессию снова.

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
Чейз Флорелл
источник
1
Отличный комментарий. Очень ясно, хотя у моей PowerShell нет прикосновения.
JustinB
9
Чтобы разрешить выполнение сценария моего профиля, мне пришлось сделать один дополнительный шаг. Запустите Powershell от имени администратора и выполните Set-ExecutionPolicy RemoteSigned -Scope CurrentUser. -ScopeВариант делает его немного более безопасным.
зомбат
2
Это отличный метод! Обратите внимание, что сама функция также становится доступной в оболочке, поэтому вам не нужна часть Set-Alias. Просто вызовите функцию MyAlias. Также для передачи аргументов используйте @Args, например,function gs { git status @Args }
Automatico
3
@Automatico Мне нравится быть откровенным, Set-Aliasпотому что я люблю называть свои методы, используя соответствующие соглашения PS с соответствующими глаголами. Но да, если вы не придирчивы, вы можете просто назвать свой метод так, как вы собираетесь вызывать.
Чейз
1
@zombat Это именно то, с чем я боролся часами. Спасибо, я закончил.
Джавад Мансур
28

2018, Windows 10

Вы можете связать любой файл или каталог с помощью простого скрипта PowerShell.

Написание сценария ярлыка файла

Откройте Windows PowerShell ISE. В панели скриптов напишите:

New-Alias ${shortcutName} ${fullFileLocation}

Затем перейдите на панель командной строки. Найдите свой профиль пользователя PowerShell с помощью echo $profile. Сохраните скрипт в этом адресе.

введите описание изображения здесь

Сценарий в адресе профиля PowerShell будет запускаться каждый раз, когда вы открываете PowerShell. Ярлык должен работать с каждым новым окном PowerShell.

Написание сценария быстрого доступа к каталогу

Это требует другой строки в нашем скрипте.

function ${nameOfFunction} {set-location ${directory_location}}
New-Alias ${shortcut} ${nameOfFunction} 

В остальном точно так же.

введите описание изображения здесь

Включить сценарии PowerShell

По умолчанию скрипты PowerShell заблокированы. Чтобы включить их, откройте настройки -> Обновление и безопасность -> Для разработчиков. Выберите режим разработчика (может потребоваться перезагрузка). Выбор режима разработчика Windows 10,

Прокрутите вниз до раздела PowerShell, установите флажок «Изменить политику выполнения ...» и примените.

Включение сценариев PowerShell

Бен Карп
источник
2
echo $profileотличный совет, помогающий найти правильное место для добавления файла. Спасибо за исчерпывающий ответ
Педро Мартинс Тимотео да Коста
19

Просто. Например...

Откройте окно Windows PowerShell и введите:

notepad $profile

Затем создайте функцию, такую ​​как:

function goSomewhereThenOpenGoogleThenDeleteSomething {
    cd C:\Users\
    Start-Process -FilePath "http://www.google.com"
    rm fileName.txt
}

Затем введите это под именем функции:

Set-Alias google goSomewhereThenOpenGoogleThenDeleteSomething

Теперь вы можете ввести слово «google» в Windows PowerShell и заставить его выполнять код в вашей функции!

Стерлинг борн
источник
$ profile, похоже, не является переменной среды по умолчанию в Windows 10. На что она должна указывать?
словами в этот день
@wordsforthewise - Автоматическая переменная $ PROFILE хранит пути к профилям PowerShell, которые доступны в текущем сеансе. Он включен в Windows PowerShell.
Стерлинг Борн
1
Это было без единого простейшего решения.
Фил
Мне пришлось включить «Включить сценарии PowerShell» (в другом ответе), чтобы заставить это работать. Серьезно супер просто!
Рокки Кев
10

Просто чтобы добавить в этот список возможных мест ...

Это не сработало для меня: \Users\{ME}\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

Однако это сделало: \Users\{ME}\OneDrive\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

Если у вас нет профиля или вы хотите его настроить, запустите следующую команду, он создаст необходимую папку / файлы и даже скажет вам, где он живет! New-Item -path $profile -type file -force

golden_grahams
источник
5

чтобы создать файл profile1.psl, введите следующую команду:

новый элемент $ PROFILE.CurrentUserAllHosts -ItemType file -Force

чтобы получить доступ к файлу, введите следующую команду:

ise $ PROFILE.CurrentUserAllHosts

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

чтобы сделать это, закройте скрипт и затем введите эту команду:

Set-ExecutionPolicy -Scope CurrentUser

затем:

RemoteSigned

тогда эта команда снова:

ise $ PROFILE.CurrentUserAllHosts

затем, наконец, введите псевдонимы в сценарии, сохраните их, и они должны запускаться при каждом запуске powershell, даже после перезагрузки компьютера.

Майкл Сандерс
источник
3
Вы , вероятно , хотите: Set-ExecutionPolicy RemoteSigned. Не ходи рекомендовать Unrestricted. Источник: itprotoday.com/management-mobility/…
PhilT
2

Это немного необычно ... но это работает:

Шаг 1. Создайте профиль Powershell:

FILE: install_profile.ps1
# THIS SCRIPT BLOWS AWAY YOUR DEFAULT POWERSHELL PROFILE SCRIPT
#   AND INSTALLS A POINTER TO A GLOBAL POWERSHELL PROFILE

$ErrorActionPreference = "Stop"

function print ([string]$msg)
{
    Write-Host -ForegroundColor Green $msg
}

print ""

# User's Powershell Profile
$psdir  = "$env:USERPROFILE\Documents\WindowsPowerShell"
$psfile = $psdir + "\Microsoft.PowerShell_profile.ps1"

print "Creating Directory: $psdir"
md $psdir -ErrorAction SilentlyContinue | out-null

# this is your auto-generated powershell profile to be installed
$content = @(
    "",
    ". ~/Documents/tools/profile.ps1",
    ""
)

print "Creating File: $psfile"
[System.IO.File]::WriteAllLines($psfile, $content)

print ""

# Make sure Powershell profile is readable
Set-ExecutionPolicy -Scope CurrentUser Unrestricted

Шаг 2: затем в инструменты ~ / Documents / tools / profile.ps1:

function Do-ActualThing {
    # do actual thing
}

Set-Alias MyAlias Do-ActualThing

Шаг 3:

$ Set-ExecutionPolicy -Scope CurrentUser Неограниченный $. ./install_profile.ps1

Билл Мур
источник