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" }
Foi útil?

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 cmdlet Start-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] }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top