2010-01-15 10 views

Respuesta

20

Utilice el Programador de tareas de Windows y ejecutar el script como el siguiente:

powershell -File myScript.ps1 -WindowStyle Hidden 

crear Además, la secuencia de comandos que se ejecuta bajo una cuenta de usuario específico y no sólo cuando el usuario ha iniciado sesión en. De lo contrario, verá una ventana de consola.

+0

Ahora, pero ¿cómo ejecuto PowerShell en segundo plano? – magol

+0

@magol - ¿Cuánto más "fondo" necesita obtener? El planificador de tareas de Windows es cómo ejecutaría una tarea de "fondo" y, en este caso, la tarea sería iniciar PowerShell y ejecutar el script especificado. –

+1

Bueno, para ser justos, la respuesta inicial no hubiera resultado en un proceso en segundo plano si el usuario actual es un administrador y no cambia la configuración predeterminada para la tarea. Sin embargo, permitir explícitamente que la tarea se ejecute independientemente del usuario que haya iniciado la sesión corrige eso. Hm. Mi script de prueba ejecutó 181 veces hasta ahora.Debería volver a desactivar esa tarea :-) – Joey

15

Quizás esta situación sea suficiente. No iniciamos PowerShell ejecutable cada minuto (esto es caro, por cierto). En cambio, lo iniciamos una vez llamando a un script adicional que llama al script de trabajo una vez por minuto (o realmente espera un minuto después de que el script de trabajo sale o falla).

Crear la puesta en Invoke-MyScript.ps1:

for(;;) { 
try { 
    # invoke the worker script 
    C:\ROM\_110106_022745\MyScript.ps1 
} 
catch { 
    # do something with $_, log it, more likely 
} 

# wait for a minute 
Start-Sleep 60 
} 

Ejecutar esto desde Cmd (por ejemplo, desde un inicio .bat):

start /min powershell -WindowStyle Hidden -Command C:\ROM\_110106_022745\Invoke-MyScript.ps1 

Aparece la ventana de PowerShell por un momento, pero se minimiza debido a start /min y en un momento se oculta para siempre. De modo que, en realidad, solo aparece el icono de la barra de tareas por un momento, no la ventana en sí. No es tan malo.

1

¡Estas respuestas son histericas! Si desea ejecutar un script de PowerShell como un trabajo en segundo plano tratan puesta en trabajo. \ Guión desde la CLI dentro de la carpeta en la que las secuencias de comandos en Casa.

9

Agenda tu tarea a ejecutar como Sistema. El comando de abajo programar una secuencia de comandos que se ejecutan en segundo plano sin mostrar ventana de la consola de PowerShell:

schtasks /create /tn myTask /tr "powershell -NoLogo -WindowStyle hidden -file myScript.ps1" /sc minute /mo 1 /ru System

/ru interruptor le permite cambiar el contexto de usuario en la que se ejecutará la tarea programada.

+0

Gracias Xemlock! En mi caso, tu sugerencia fue la única solución que no generó absolutamente ninguna ventana de PowerShell. – WebFixItMan

2

En la pestaña [General] en las propiedades del Programador de tareas para la tarea, seleccionar el botón "Ejecutar si el usuario está conectado o no" impide que la ventana aparezca en mi máquina con Windows 7.

1

Si desea ejecutar el script automáticamente en el intervalo de tiempo. (Para el sistema operativo Windows)

1) Open Schedule tasks from control panel. 
2) Select Task Scheduler Library from left side window. 
3) select Create Task from right side window. 
4) Enter Name in General tab (any name). 
5) Open Triggers tab -> New 
6) Select interval as needed.Use Advanced settings for repeat task. 
7) Open Actions tab ->New 
8) Copy/Paste following line in Program/script * 

* Here D:\B.ps1 in code is path to my B.ps1 file 

C: \ Windows \ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe D: \ B.ps1

9) ok and apply changes 
10) Done! 
-1
# Filecheck.ps1 

# Version 1.0 

# Use this to simply test for the existance of an input file... Servers.txt. 

# I want to then call another script if the input file exists where the 

# servers.txt is neded to the other script. 

# 


    $workpath=".\Server1\Restart_Test" 

# Created a functon that I could call as part of a loop. 


    function Filecheck 

    { 
    if (test-path $workpath\servers.txt) 

     { 

     rename-item $workpath\servers.txt servers1.txt 

     "Servers.txt exist... invoking an instance of your script agains the list of servers" 


     Invoke-Expression .\your_Script.ps1 

     } 

    Else 
     { 

      "sleeping" 

      Start-Sleep -Seconds 60 
     } 

    } 

    Do 
     { 
     Filecheck 

     $fred=0 
     # Needed to set a variabe that I could check in the while loop. 

     # Probably a better way but this was my way. 

     } 

     While($fred -lt 1) 
Cuestiones relacionadas