Pregunta

¿Hay una manera de especificar un directorio de trabajo al comando Start-Job?

casos de uso:

Estoy en un directorio, y quiero abrir un archivo con Emacs para su edición. Si hago esto directamente, se bloqueará hasta que cierro PowerShell Emacs. Pero el uso de Start-Job intenta ejecutar Emacs de mi directorio personal, teniendo así Emacs abrir un nuevo archivo en lugar de la que quería.

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

Por lo tanto, esto es lo que he intentado, simplemente para la corrección:

Start-Job { emacs RandomFile.txt }
Start-Job { emacs "$pwd/RandomFile.txt" }
¿Fue útil?

Solución

Una posible solución sería la creación de un "kicker-script":

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

El script se vería así:

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

Espero que esto ayude.

Otros consejos

Para resumir el problema:

  • Un trabajo de fondo empezó con Start-Job qué no heredan el (directorio de trabajo) ubicación actual.

    • valores predeterminados para $HOME\Documents en Windows PowerShell, y $HOME en PowerShell Core (como de PSv5.1 / PSV6 alfa).

    • Si está utilizando PowerShell Core y que está dirigida a un archivo en el actuales directorio, se puede utilizar el después, debido a que el nueva sintaxis ... & por defecto ejecuta el trabajo en el actuales directorio :
      emacs RandomFile.txt &

  • No se puede directamente variables de referencia de la actuales sesión en un bloque de script pasado a Start-Job.

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

PSV3 introdujo una forma sencilla de hacer referencia al actuales las variables de sesión 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 alcance $using::

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

Alternativamente:

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

Nota:

  • Este problema GitHub propone la adición de un -WorkingDirectory al cmdlet Start-Job.

    • Start-Job -WorkingDirectory $PWD { emacs RandomFile.txt } # WISHFUL THINKING
  • Este problema GitHub informes sorprendente la incapacidad de usar $using: en el guión bloque pasó a -InitializationScript, a pesar de que trabaja en el bloque de script principal (el parámetro -ScriptBlock implícita).

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

Probar

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

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

Start-Job es una exageración para lo que necesita (que se ejecuta un comando en el fondo). Utilice Iniciar Proceso 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 tan simple como sea 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).

Sólo por completo, aquí está el guión final he realizado, basándose en la respuesta de Filburt, estilo wiki de la comunidad:

function Start-Emacs ( [string]$file )
{
    Start-Job -ArgumentList "$pwd\$file" { emacs $args[0] }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top