2011-12-15 29 views
10

Xét đoạn mã sau:Làm cách nào để tôi có thể bắt đầu một công việc nền trong Powershell để sống lâu hơn?

start-job -scriptblock { sleep 10; cmd /c set > c:\env.txt; } 
exit 

Công việc nền thiệt mạng khi các lối ra cha mẹ, vì vậy cuộc gọi đến cmd.exe không bao giờ xảy ra. Tôi muốn viết một số mã tương tự, như vậy mà cha mẹ thoát ngay lập tức, và đứa trẻ tiếp tục chạy trong nền.

Tôi muốn giữ mọi thứ trong một tập lệnh nếu có thể.

Trả lời

9

Bạn sẽ phải bắt đầu một quá trình:

start-process powershell -ArgumentList "sleep 10; cmd /c set > c:\env.txt" -WindowStyle hidden 
1

Bạn cũng có thể làm điều đó như thế

$a = start-job -scriptblock { sleep 10; cmd /c set > c:\env.txt; } 
Register-ObjectEvent -InputObject $a -EventName StateChanged -SourceIdentifier "finished" 
$b = Wait-Event -SourceIdentifier "finished" 
exit 

Kịch bản của bạn sẽ đợi cho sự kết thúc của scriptblock để kết thúc.

+2

Sẽ không giống như sử dụng công việc chờ? – manojlds

+0

Bạn có lẽ đúng, tôi sẽ kiểm tra! – JPBlanc

+0

Những gì tôi đã cố gắng để nói là, tôi không nghĩ rằng OP muốn điều đó. Những gì họ muốn là công việc vẫn chạy khi cha mẹ đóng (và nên đóng) nhưng không nên chờ công việc. Nhưng tôi có thể sai trong điều này :) – manojlds

0

Nếu thấy rằng sử dụng Invoke-Command có thể bỏ qua giới hạn mà công việc nền chết với cha mẹ của nó. Điều thú vị là cú pháp gần như giống như bắt đầu công việc, do đó, các scriptblock có thể được giữ như là.

start-job -scriptblock { sleep 10; cmd /c set > c:\env.txt; } 

sẽ chỉ biến thành

Invoke-Command -ComputerName . -AsJob -scriptblock { sleep 10; cmd /c set > c:\env.txt; } 

và đột nhiên tồn tại cái chết của nó là cha mẹ (có lẽ vì invoke-lệnh là phù hợp để chạy các chương trình trên máy tính khác để phụ huynh không bao giờ có thể quan trọng đối với nó)

0

Nếu bạn sử dụng Bắt đầu quá trình, bạn tạo một quy trình con mới có phiên quyền quyền hạn của bạn làm quy trình gốc. Nếu bạn giết quá trình của phụ huynh quyền hạn bắt đầu quá trình này, quy trình mới sẽ bị mồ côi và tiếp tục chạy. Nó sẽ, tuy nhiên, không thể tồn tại nếu bạn giết cha mẹ quá trình cây

Start-Process -FilePath notepad.exe 

Powershell không thể bắt đầu một quá trình độc lập mới bên ngoài của cây tiến trình của nó cho bạn. Tuy nhiên, điều này có thể được thực hiện trong Windows bằng cách sử dụng CreateProcess và chức năng này được hiển thị thông qua WMI. May mắn thay, bạn có thể gọi đó là từ PowerShell:

Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList notepad.exe 

Bằng cách này, quá trình mới cũng sẽ tiếp tục chạy nếu cây quá trình bị giết, bởi vì quá trình mới không có phiên PowerShell của bạn như là một phụ huynh, nhưng quy trình lưu trữ WMI.

Các vấn đề liên quan