2010-01-12 28 views
5

Tôi đang chạy một Dịch vụ Windows (Hudson) mà đến lượt nó tạo ra một quá trình PowerShell để chạy các lệnh PowerShell tùy chỉnh của tôi. Một phần của kịch bản của tôi là giải nén tệp bằng CopyHere. Khi tôi chạy tập lệnh này cục bộ, tôi thấy hộp thoại tiến trình bật lên khi các tệp được trích xuất và sao chép. Tuy nhiên, khi điều này chạy theo dịch vụ, nó treo ở điểm mà một hộp thoại sẽ xuất hiện.Powershell đang chạy dưới một dịch vụ bị treo trên * .zip CopyHere

Đây là phần giải nén tập lệnh của tôi.

# Extract the contents of a zip file to a folder 
function Extract-Zip { 
    param([string]$zipFilePath, [string]$destination) 
    if(test-path($zipFilePath))  { 
     $shellApplication = new-object -com shell.application 

     $zipFile = get-item $zipFilePath 
     $zipFolder = $shellApplication.NameSpace($zipFile.fullname) 

     $destinationFile = get-item $destination 
     $destinationFolder = $shellApplication.NameSpace($destinationFile.fullname) 

     $destinationFolder.CopyHere($zipFolder.Items()) 
    } 
} 

Tôi nghi ngờ rằng vì nó đang chạy trong một quy trình dịch vụ không có đầu (không tương tác với máy tính), bằng cách nào đó nó đang cố gắng hiển thị hộp thoại.

Có cách nào khác không?

+0

Bạn đã thử plugin powerhell cho Hudson chưa? Có thể điều đó sẽ giúp ích cho bạn. –

Trả lời

1

Nhìn vào documentation cho PowerShell, có vẻ như tùy chọn -NonInteractive có thể giúp đây

+0

Điều đó sẽ ngăn PowerShell hiển thị lời nhắc nhưng tôi không nghĩ rằng nó sẽ ngăn Windows hiển thị giao diện người dùng. –

2

Nếu đây đang chạy trên Vista hoặc Windows 7, nảy lên UI từ một dịch vụ sẽ không được nhìn thấy bởi người dùng cuối như bạn nghi ngờ. Xem bài báo này trên Session 0 Isolation. Tuy nhiên, hộp thoại tiến trình có yêu cầu đầu vào của người dùng không? Nếu không, tôi sẽ không nghĩ điều đó sẽ khiến dịch vụ bị treo. Tôi sẽ tìm một tùy chọn để tắt hiển thị tiến trình. Nếu bạn không thể tìm thấy điều đó, hãy thử chuyển sang trình giải nén ZIP khác. PSCX 1.2 đi kèm với lệnh mở rộng Lưu trữ. Tôi chắc rằng cũng có những người khác có sẵn.

+0

Hộp thoại tiến trình không yêu cầu đầu vào của người dùng. Khi tôi chạy nó từ một dấu nhắc lệnh, nó không - nó chỉ hiển thị hộp thoại tiến trình mà không cần bất kỳ đầu vào bắt buộc nào, và sau đó khi hộp thoại thực hiện xong, hộp thoại biến mất. Hộp thoại tiến trình thực tế được sinh ra bằng phương pháp CopyHere. Giả sử, có các tùy chọn bạn có thể vượt qua để chặn bất kỳ tương tác tiềm năng nào, nhưng có hàng tá bài đăng ngoài đó phàn nàn rằng PowerShell bỏ qua các tùy chọn cụ thể đó. Tôi đã hy vọng tránh những thứ của bên thứ ba càng nhiều càng tốt, nhưng tôi có thể phải hang động. – Trinition

+0

Lệnh ghép ngắn của nhà cung cấp PSCX trên đầu trang của 7-Zip nhưng nếu bạn muốn, bạn luôn có thể sử dụng 7-Zip trực tiếp - http://www.7-zip.org/ –

3

Nếu nó vẫn còn thực tế, tôi quản lý để sửa lỗi này với có CopyHere params bằng 1564.

Vì vậy, trong trường hợp chiết xuất zip của tôi chức năng trông giống như:

function Expand-ZIPFile{ 
    param(
    $file, $destination 
    ) 
    $shell = new-object -com shell.application 
    $zip = $shell.NameSpace($file) 
    foreach($item in $zip.items()) 
    { 
    $shell.Namespace($destination).copyhere($item,1564) 
    "$($item.path) extracted" 
    } 

1564 mô tả có thể được tìm thấy ở đây - http://msdn.microsoft.com/en-us/library/windows/desktop/bb787866(v=vs.85).aspx :

(4) Không hiển thị hộp thoại tiến trình.
(8) Cung cấp cho tệp đang hoạt động trên tên mới khi di chuyển, sao chép hoặc đổi tên hoạt động nếu tệp có tên mục tiêu đã tồn tại.
(16) Trả lời "Có cho tất cả" cho bất kỳ hộp thoại nào được hiển thị.
(512) Không xác nhận việc tạo thư mục mới nếu thao tác yêu cầu phải tạo một thư mục mới.
(1024) Không hiển thị giao diện người dùng nếu xảy ra lỗi.

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