¿Hay alguna manera de saber lo que se ejecuta un script cuando se comenzó con la puesta en -filename trabajo?
-
26-09-2019 - |
Pregunta
Estoy empezando un trabajo PowerShell con algo como el siguiente comando:
start-job -filename my_script.ps1 -argumentlist ($v1, $v2, $v3)
Esta secuencia de comandos, sin embargo tiene que saber dónde se encuentra, ya que se ejecuta otros comandos en función de su ubicación con respecto a la misma. Cuando se ejecuta directamente desde el indicador, construcciones tales como estos trabajos:
join-path (split-path (& { $myinvocation.scriptname })) "relative path\filename"
join-path (split-path $myinvocation.mycommand.definition) "relative path\filename"
Esto no funciona en absoluto cuando comenzó como un puesto de trabajo como en el primer ejemplo, sin embargo. ¿Cómo puedo determinar dónde estoy corriendo de cuando me puse como un trabajo?
Solución
Parece ser como el caso de comunicación remota donde el archivo se pasa en el trabajo como un bloque de script por lo que la noción de qué archivo de la secuencia de comandos vino de que se pierde. Se podía pasar en el camino, así (a pesar de que parece menos que ideal):
PS> gc .\job.ps1
param($scriptPath)
"Running script $scriptPath"
PS> $job = Start-Job -FilePath .\job.ps1 -ArgumentList $pwd\job.ps1
PS> Wait-Job $job
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
13 Job13 Completed True localhost param($scriptPath)...
PS> Receive-Job $job.id
Running script C:\Users\hillr\job.ps1
Otros consejos
ACTUALIZADO:
Me encontré con este ejemplo de código:
http://blog.brianhartsock.com / 2010/05/22 / a-mejor-Start-Job-cmdlet /
En lugar de un ScriptBlock, utilizar el parámetro FilePath, I modificado como tal:
param([string]$file)
$filePath = split-path $file -parent
Start-Job -Init ([ScriptBlock]::Create("Set-Location $filePath")) -FilePath $file -ArgumentList $args
Esto se llama como:
Start-JobAt c:\full_path\to\file\my_script.ps1 ($v1, $v2, $v3)
El uso de init (-InitializationScript) y disparando el Set-Location mueve el proceso de ejecución actual al directorio de la secuencia de comandos, por lo que, desde allí se puede determinar la ubicación relativa.
A medida que el blog menciona, usted podría tener esto como un script externo (he probado la mía puesta en JobAt.ps1) o que sea parte de su perfil de usuario / cuenta de servicio.