Рабочий Каталог Запуска PowerShell
есть ли способ указать рабочий каталог для команды Start-Job?
Use-case:
Я в каталог, и я хочу открыть файл с помощью Emacs для редактирования. Если я сделаю это напрямую, он заблокирует PowerShell, пока я не закрою Emacs. Но используя Start-Job пытается запустить Emacs из моего домашнего каталога, таким образом, Emacs открывает новый файл вместо того, который я хотел.
я попробовал указать полный путь с помощью $pwd, но переменные в блоке скрипта не разрешено, пока они не будут выполняться в контексте начального задания. Таким образом, какой-то способ принудительного разрешения переменных в контексте оболочки также был бы приемлемым ответом на это.
Итак, вот что я пробовал, просто для полноты:
Start-Job { emacs RandomFile.txt }
Start-Job { emacs "$pwd/RandomFile.txt" }
6 ответов
возможным решением было бы создать "Кикер-скрипт":
Start-Job -filepath .\emacs.ps1 -ArgumentList $workingdir, "RandomFile.txt"
ваш скрипт будет выглядеть так:
Set-Location $args[0]
emacs $args[1]
надеюсь, что это помогает.
есть хорошее решение от раздел комментариев поста какого-то чувака. Комментатор предлагает использовать Init
параметр для настройки рабочего каталога блока скрипта.
function start-jobhere([scriptblock]$block) {
Start-Job -Init ([ScriptBlock]::Create("Set-Location '$pwd'")) -Script $block
}
попробуй такое
Start-Job -inputobject $pwd -scriptblock { emacs "$input/RandomFile.txt" }
здесь $input
- предопределенная переменная, которая внутренне принимает значение -inputobject
параметр
обобщить проблему:
-
фоновое задание началось с
Start-Job
тут не наследовать текущее местоположение (рабочий каталог).по умолчанию
$HOME\Documents
В Windows PowerShell и$HOME
в PowerShell Core (начиная с PSv5.1 / PSv6 alpha).если вы используете PowerShell базовый и вы нацелены на файл в настоящее каталог, вы можете использовать следующее, потому что новая
... &
синтаксис по умолчанию запускает задание в настоящее каталог:emacs RandomFile.txt &
нельзя напрямую ссылочные переменные из настоящее сеанс в блоке скрипта передается в
Start-Job
.
дополнить собственный полезный ответ jdmichal и asavartsov ответ, которые все еще работают хорошо:
PSv3 представила простой способ ссылки на настоящее переменные сеанса в блоке скрипта, который выполняется в другом контексте (в качестве фонового задания или на удаленной машине), через $using:
объем:
Start-Job { Set-Location $using:PWD; emacs RandomFile.txt }
кроме того:
Start-Job { emacs $using:PWD/RandomFile.txt }
Примечание:
-
этот вопрос GitHub предлагает добавить
-WorkingDirectory
до .Start-Job -WorkingDirectory $PWD { emacs RandomFile.txt } # WISHFUL THINKING
-
этот выпуск GitHub сообщает удивительную неспособность использовать
$using:
в блоке скрипта передается-InitializationScript
, хотя он работает в основном блоке сценария (подразумеваемые
Start-Job-это перебор для того, что вам нужно (запуск команды в фоновом режиме). Использовать Запустить-Процесс вместо:
Start-Process -NoNewWindow emacs RandomFile.txt
в этом подходе нет проблем с текущим каталогом. Я также создал функцию, чтобы сделать это как можно проще:
function bg() {Start-Process -NoNewWindow @args}
и тогда вызов будет:
bg emacs RandomFile.txt
это работает в Windows 7 (Powershell v2).
просто для полноты, вот окончательный сценарий, который я реализовал на основе ответа Filburt, стиль community-wiki:
function Start-Emacs ( [string]$file )
{
Start-Job -ArgumentList "$pwd$file" { emacs $args[0] }
}