Запустите команду при запуске powershell, используя переменную pwd - PullRequest
0 голосов
/ 27 августа 2018

Когда вы находитесь в проводнике, вы можете нажать File > Open Windows Powershell (или его значок на панели быстрого доступа), чтобы запустить экземпляр Powershell в каталоге, в котором находится ваш файловый менеджер. Я хотел бы затем автоматически запустить простая команда в этом каталоге и закройте окно Powershell после того, как это будет сделано.

Я попытался добавить свою команду в свой профиль Powershell, но она выполняется до того, как была задана переменная пути, и выполняется с $pwd, равным C:\Users\MyUsername (мой домашний каталог) или C:\WINDOWS\system32 (кажется, расы какого-то рода, понятия не имею, почему так или иначе). Насколько я понимаю, это потому, что проводник файлов «кнопка открытия в powershell» открывает powershell и ТОГДА компакт-диски в каталог, в котором я находился в проводнике файлов. Поэтому, когда файл profile.ps1 запущен, он использует только те каталоги, которые он знает, поскольку вызов cd еще не был выполнен. Это похоже на выполнение команды start powershell.exe в cmd против start powershell.exe -command "cd 'C:\wherever'". Первый правильно запускает команду моего профиля, а второй использует текущий каталог cmd, а не C:\wherever.

Итак, очевидно, что переменная $pwd присваивается в разное время в случае ее открытия из cmd и открытия из проводника. Есть ли способ отложить выполнение команды в профиле до полной загрузки оболочки? Просто спать сценарий не помогает.

В качестве альтернативы, если кто-то знает, как редактировать реестр, чтобы я мог изменить поведение нажатия File > Open Windows Powershell (поскольку он должен иметь доступ к некоторой переменной, хранящей текущий каталог, и я предполагаю, что он вызывает исполняемый файл Powershell с этой переменной как аргумент cd'd to), это тоже сработает.

С другой стороны, я мог бы быть невероятно наивным о том, как File > Open Windows Powershell и процесс создания экземпляров Powershell.

Любая помощь очень ценится, спасибо!

Ответы [ 2 ]

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

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

function Prompt
{
    & C:\Program` Files\MyProgram\MyProgram.exe "$pwd"
    stop-process -Id $PID
}
0 голосов
/ 28 августа 2018

Я понял это самым хакерским, грубым способом из всех, но без легкого доступа к внутренним компонентам Windows это единственный рабочий метод, который я смог найти. Я настроил свой профиль powershell, чтобы заголовок окна был моим приглашением, например:

function Prompt
{
  $host.ui.RawUI.WindowTitle = $(get-location)
  “PS> “
}

Затем я установил задачу в Task Scheduler, которая была вызвана PowerShell, достигающим ее приглашения (есть 3 возможных перехвата, когда консоль запускается, когда она запускает поток прослушивания IPC и когда консоль готова для ввода). Для этого я использовал Event Viewer (я собирался публиковать скриншоты, но у меня еще нет 10 репутации).

Затем я установил действие для этой задачи, чтобы запустить скрипт, показанный ниже, который читает из заголовка окна моего первого экземпляра powershell

Start-Sleep -s 1
$A = Get-Process -Name powershell | Where-Object -FilterScript {$_.Id -ne $PID}
$B = $A.MainWindowTitle
& C:\Program` Files\MyProgram\MyProgram.exe "$B"
stop-process -Id $A.Id
stop-process -Id $PID

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...