Powershell - Gỡ cài đặt danh sách các chương trình mất quá nhiều thời gian


0

Tôi đang tìm kiếm sự hỗ trợ để làm cho một chút mã hiệu quả hơn. Tôi hiện có một tập lệnh Powershell đơn giản (một phần của tập lệnh lớn hơn) liệt kê các mục từ tệp văn bản (cụ thể là chuỗi được sử dụng để xác định chương trình đã cài đặt) và sau đó thử gỡ cài đặt từng chuỗi đó bằng msiexec:

$javaUninstall = Get-Content .\jre-uninstall-list.txt
    foreach ($java in $javaUninstall) {
    write-host "Trying", "$java"
    $app = Get-WmiObject -Class Win32_Product | Where-Object {
        $_.IdentifyingNumber -match "$java"
    }
    &cmd /c "msiexec /uninstall $($app.IdentifyingNumber) /passive /quiet"
}

Mã này gỡ cài đặt chính xác mọi phiên bản Java 32 bit khỏi Java 5 và trên đó có trên hệ thống. Tuy nhiên, phải mất mãi mãi . Mỗi mục chạy trong 5-10 giây - và sau đó nó chuyển sang mục tiếp theo. Có cách nào để nhanh chóng bỏ qua các phiên bản không tìm thấy không? Sử dụng một tệp bó này chạy trong dưới 15 giây phẳng.


Tôi nghĩ một phần của vấn đề của bạn là bạn đang gọi shell lệnh cho mỗi lần gỡ cài đặt. Hãy thử thực hiện msiexec trực tiếp.
Keltari

Vì vậy, lấy dòng cuối cùng và thay đổi nó thành: msiexec / gỡ cài đặt $ ($ app.IdentifyingNumber) / thụ động / yên tĩnh?
Tim P.

Đã cho rằng một xoáy. Nó vẫn hoạt động chính xác, nhưng không có sự cải thiện lớn về thời gian thực hiện so với tệp bó tiêu chuẩn.
Tim P.

Nên $_.IdentifyingNumber -match "$java"được $_.Name -match "$java"? Mặt khác, nếu $javađã chứa Mã xác định, tại sao bạn lại truy vấn nó?
Rynant

Phần $ _. RecognifyingNumber thực sự đại diện cho một cái gì đó như thế này: Mã xác định được liệt kê trong tệp văn bản thay vì Tên, vì Tên có thể kết thúc với dương tính giả.
Tim P.

Câu trả lời:


1

$javabiến đã chứa Mã xác định, chỉ cần sử dụng trực tiếp với msiexec.

$javaUninstall = Get-Content .\jre-uninstall-list.txt
foreach ($java in $javaUninstall) {
    write-host "Trying", "$java"
    msiexec /uninstall $java /passive /quiet
}

Đây là một phát hiện tuyệt vời. Dù sao tôi cũng cần gọi cmd / c, vì quá trình không thành công nếu có nhiều hơn một cài đặt Java tồn tại do thực tế là nó không chờ. Vì vậy, tôi làm một cmd / c BẮT ĐẦU / CHỜ ĐỢI ... và cứ thế. Tôi đánh giá cao sự giúp đỡ, điều này làm cho nó nhanh hơn nhiều.
Tim P.

1
@Tim, bạn không thể làm gì Start-Process -Waitthay vì gọi cmd.exe?
dangph

0

Như @dangph đã nói, đây là mã PowerShell bên dưới để bạn không phải gọi CMD /Clệnh và người dùng giờ chỉ phải điền vào các biến thay vì chơi theo cú pháp.

Tôi không biết nhiều về sự thay đổi, nhưng người dùng không phải lo lắng về việc làm hỏng tập lệnh có thể ổn, nếu họ cần thay đổi tập lệnh thường xuyên, như tôi làm với tập lệnh của mình.

$javaUninstall = Get-Content -Path .\jre-uninstall-list.txt
$args = "/x $java /passive /quiet"
$msi = "msiexec"
foreach ($java in $javaUninstall) {
    write-host "Trying", "$java"
    Start-Process -FilePath $msi -ArgumentList $args -Wait -PassThru
}

Chắc chắn @DavidPostill, người dùng bây giờ chỉ phải điền vào các biến thay vì chơi với cú pháp là tốt. Tôi không biết nhiều về sự thay đổi, nhưng người dùng (nếu chưa quen với powershell, và hãy nhớ rằng câu trả lời này không chỉ cho người hỏi mà bất kỳ ai cũng gặp phải câu hỏi này) không phải lo lắng về việc làm hỏng kịch bản Mặt khác có thể ổn, nếu họ cần thay đổi tập lệnh thường xuyên, như tôi làm với tập lệnh của mình.
Ngẫu nhiên 206

@DavidPostill Chắc chắn, không có vấn đề gì :)
Ngẫu nhiên 206

Tôi đã thực hiện chỉnh sửa trên iPhone của mình thông qua ứng dụng nên không chắc nó có làm hỏng bố cục và khối mã không.
Ngẫu nhiên 206

-1

Bạn có thể loại bỏ từng mục trong trường hợp quyền hạn của chính nó. Giải pháp tôi đang cung cấp có thể sẽ tốn nhiều tài nguyên nhất (FYI). Tôi không muốn lấy tín dụng cho công việc của người khác, vì vậy tôi sẽ liên kết ví dụ về kịch bản được cung cấp TẠI ĐÂY.

Bạn có thể xây dựng ví dụ thành một hàm và sau đó lặp lại hàm bên trong foreachvòng lặp của bạn .


2
Chỉ một cài đặt / gỡ cài đặt MSI có thể chạy cùng một lúc. Quay ra các trường hợp riêng biệt sẽ dẫn đến va chạm.
EBGreen

@ebreen không có trong windows 7
Colyn1337
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.