Directorio de trabajo PowerShell Start-Job
-
19-09-2019 - |
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" }
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
No es agradable solución de la sección de comentarios rel="noreferrer"> href="http://blog.brianhartsock.com/2010/05/22/a-better-start-job-cmdlet/#comments" . Comentarista sugiere utilizar el parámetro Init
al directorio de trabajo de configuración 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 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 cmdletStart-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] }
}