powershell start-job

Directorio de trabajo de inicio de tareas de PowerShell



start-job (6)

Una posible solución sería crear un "script kicker":

Start-Job -filepath ./emacs.ps1 -ArgumentList $workingdir, "RandomFile.txt"

Tu script se vería así:

Set-Location $args[0] emacs $args[1]

Espero que esto ayude.

¿Hay alguna forma de especificar un directorio de trabajo para el comando Start-Job?

Caso de uso:

Estoy en un directorio y quiero abrir un archivo usando Emacs para editarlo. Si hago esto directamente, bloqueará PowerShell hasta que cierre Emacs. Pero el uso de Start-Job intenta ejecutar Emacs desde mi directorio personal, lo que hace que Emacs abra un archivo nuevo en lugar del que yo quería.

Traté de especificar la ruta completa usando $ pwd, pero las variables en el bloque de script no se resuelven hasta que se ejecutan en el contexto de Start-Job. Entonces, alguna forma de forzar la resolución de las variables en el contexto del shell también sería una respuesta aceptable a esto.

Entonces, esto es lo que he intentado, solo por completitud:

Start-Job { emacs RandomFile.txt } Start-Job { emacs "$pwd/RandomFile.txt" }


Solo para completar, aquí está el guión final que implementé basado en la respuesta de Filburt, estilo community-wiki:

function Start-Emacs ( [string]$file ) { Start-Job -ArgumentList "$pwd/$file" { emacs $args[0] } }


Start-Job es una exageración para lo que necesita (ejecutando un comando en el fondo). Use Start-Process en su lugar:

Start-Process -NoNewWindow emacs RandomFile.txt

No hay problema con el directorio actual en este enfoque. También he creado una función para hacer esto lo más simple posible:

function bg() {Start-Process -NoNewWindow @args}

y luego la invocación se convierte en:

bg emacs RandomFile.txt

Esto funciona en Windows 7 (Powershell v2).


prueba esto

Start-Job -inputobject $pwd -scriptblock { emacs "$input/RandomFile.txt" }

Aquí $input es una variable predefinida que toma internamente el valor del parámetro -inputobject


Hay una buena solución en la sección de comentarios de la publicación de algún amigo . Commenter sugiere usar el parámetro Init para configurar el directorio de trabajo del bloque de script.

function start-jobhere([scriptblock]$block) { Start-Job -Init ([ScriptBlock]::Create("Set-Location ''$pwd''")) -Script $block }


Para resumir el problema:

  • Un trabajo en segundo plano iniciado con Start-Job no hereda la ubicación actual (directorio de trabajo).

    • Su valor predeterminado es $HOME/Documents en Windows PowerShell y $HOME en PowerShell Core (a partir de PSv5.1 / PSv6 alpha).

    • Si está utilizando PowerShell Core y está apuntando a un archivo en el directorio actual , puede usar lo siguiente, porque la nueva ... & sintaxis ejecuta de manera predeterminada el trabajo en el directorio actual :
      emacs RandomFile.txt &

  • No puede referenciar directamente las variables de la sesión actual en un bloque de script pasado a Start-Job .

Para complementar la propia respuesta útil de jdmichal y la respuesta útil de asavartsov , que todavía funciona bien:

PSv3 introdujo una forma simple de referenciar las variables de la sesión actual en un bloque de script que se ejecuta en un contexto diferente (como un trabajo en segundo plano o en una máquina remota), a través del $using: scope:

Start-Job { Set-Location $using:PWD; emacs RandomFile.txt }

Alternativamente:

Start-Job { emacs $using:PWD/RandomFile.txt }

Nota:

  • Este problema de GitHub propone agregar un -WorkingDirectory al cmdlet de Start-Job .

    • Start-Job -WorkingDirectory $PWD { emacs RandomFile.txt } # WISHFUL THINKING
  • Este problema de GitHub informa la sorprendente incapacidad de usar $using: en el bloque de script pasado a -InitializationScript , aunque funciona en el bloque de script principal (el parámetro implícito -ScriptBlock ).

    • Start-Job -Init { Set-Location $using:PWD } { emacs RandomFile.txt } # FAILS