Start-Job Diretório de Trabalho PowerShell
-
19-09-2019 - |
Pergunta
Existe uma maneira para especificar um diretório de trabalho para o comando Start-Job?
Use a caso:
Eu estou em um diretório, e eu quero abrir um arquivo usando Emacs para edição. Se eu fizer isso diretamente, ele irá bloquear PowerShell até eu fechar Emacs. Mas o uso de tentativas Start-Job para executar Emacs do meu diretório home, tendo assim Emacs abrir um novo arquivo em vez do que eu queria.
Eu tentei especificar o caminho completo usando $ pwd, mas variáveis ??no bloco de script não são resolvidos até que eles estão executando no contexto Start-Job. Então, de alguma forma para forçar resolver as variáveis ??no contexto shell também seria uma resposta aceitável para isso.
Então, aqui está o que eu tentei, apenas para ser completo:
Start-Job { emacs RandomFile.txt }
Start-Job { emacs "$pwd/RandomFile.txt" }
Solução
Uma possível solução seria a criação de um "kicker-script":
Start-Job -filepath .\emacs.ps1 -ArgumentList $workingdir, "RandomFile.txt"
Seu script ficaria assim:
Set-Location $args[0]
emacs $args[1]
Espero que isso ajude.
Outras dicas
Não é bom solução de comentários de pós de algum cara. Comentarista sugere usar parâmetro Init
a configuração diretório de trabalho do bloco de script.
function start-jobhere([scriptblock]$block) {
Start-Job -Init ([ScriptBlock]::Create("Set-Location '$pwd'")) -Script $block
}
Para resumir o problema:
-
Um trabalho de fundo começou com
Start-Job
não herdar a localização atual (diretório de trabalho).-
O padrão é
$HOME\Documents
no Windows PowerShell, e$HOME
em PowerShell núcleo (a partir de PSv5.1 / PSv6 alpha). -
Se você estiver usando PowerShell Núcleo e você está alvejando um arquivo no atual diretório, você pode usar o seguinte, porque o nova sintaxe
... &
por padrão executa o trabalho no atual diretório :
emacs RandomFile.txt &
-
-
Você não pode diretamente variáveis ??de referência do atual sessão em um bloco de script passado para
Start-Job
.
Para complementar de jdmichal própria resposta útil e útil resposta de asavartsov, que ainda funcionam bem:
pSV3 introduziram uma maneira simples de fazer referência ao atual variáveis ??de sessão em um bloco de script que é executado em um contexto diferente (como um trabalho de fundo ou em uma máquina remota), através do escopo $using:
:
Start-Job { Set-Location $using:PWD; emacs RandomFile.txt }
Como alternativa:
Start-Job { emacs $using:PWD/RandomFile.txt }
Nota:
-
Esta questão GitHub propõe a adição de um
-WorkingDirectory
para o cmdletStart-Job
.-
Start-Job -WorkingDirectory $PWD { emacs RandomFile.txt } # WISHFUL THINKING
-
-
Esta questão GitHub relata a incapacidade surpreendente para uso
$using:
no script bloquear passado para-InitializationScript
, mesmo que ele funciona no bloco de script principal (o parâmetro-ScriptBlock
implícita).-
Start-Job -Init { Set-Location $using:PWD } { emacs RandomFile.txt } # FAILS
-
Tente este
Start-Job -inputobject $pwd -scriptblock { emacs "$input/RandomFile.txt" }
Aqui $input
é variável predefinida que internamente tomar o valor de -inputobject
parâmetro
Start-Job é um exagero para o que você precisa (a execução de um comando em segundo plano). Use Iniciar-Process em vez disso:
Start-Process -NoNewWindow emacs RandomFile.txt
Não há nenhum problema com o diretório atual nesta abordagem. Além disso, criei uma função para fazer isso o mais simples possível:
function bg() {Start-Process -NoNewWindow @args}
e, em seguida, a invocação torna-se:
bg emacs RandomFile.txt
Isso funciona em Windows 7 (Powershell v2).
Apenas quanto à completude, aqui está o roteiro final I implementadas com base nas de Filburt resposta, comunidade wiki estilo:
function Start-Emacs ( [string]$file )
{
Start-Job -ArgumentList "$pwd\$file" { emacs $args[0] }
}