Powershell - การถอนการติดตั้งรายการโปรแกรมใช้เวลานานเกินไป


0

ฉันกำลังมองหาความช่วยเหลือในการทำให้โค้ดมีประสิทธิภาพมากขึ้น ขณะนี้ฉันมีสคริปต์ Powershell ง่าย ๆ (ส่วนหนึ่งของสคริปต์ที่ใหญ่กว่า) ที่ระบุรายการจากไฟล์ข้อความ (คือสตริงที่ใช้เพื่อระบุโปรแกรมที่ติดตั้ง) แล้วลองถอนการติดตั้งแต่ละสตริงเหล่านั้นโดยใช้ 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"
}

รหัสนี้ถอนการติดตั้ง Java เวอร์ชัน 32 บิตอย่างถูกต้องจาก Java 5 และบนที่มีอยู่ในระบบ แต่จะใช้เวลาตลอดไป แต่ละรายการจะทำงานประมาณ 5-10 วินาที - จากนั้นจะไปยังรายการถัดไป มีวิธีใดที่จะให้ข้ามเวอร์ชันที่ไม่พบได้อย่างรวดเร็วหรือไม่ การใช้ไฟล์แบตช์จะทำงานในเวลาไม่ถึง 15 วินาที


ฉันคิดว่าส่วนหนึ่งของปัญหาของคุณคือคุณเรียกใช้เชลล์คำสั่งสำหรับการถอนการติดตั้งแต่ละครั้ง ลองดำเนินการ msiexec โดยตรง
Keltari

ดังนั้นให้ใช้บรรทัดสุดท้ายและเปลี่ยนเป็น: msiexec / ถอนการติดตั้ง $ ($ app.IdentifyingNumber) / passive / เงียบ
ทิมพี

ให้หมุนวน มันยังทำงานได้อย่างถูกต้อง แต่ไม่มีการปรับปรุงอย่างมากในเวลาดำเนินการเมื่อเทียบกับไฟล์แบตช์มาตรฐาน
ทิมพี

ควร$_.IdentifyingNumber -match "$java"เป็น$_.Name -match "$java"อย่างไร มิฉะนั้นถ้า$javaมี IdentifyingNumber อยู่แล้วทำไมคุณถึงค้นหามัน
Rynant

ส่วน $ _. IdentifyingNumber แสดงถึงสิ่งนี้: {26A24AE4-039D-4CA4-87B4-2F83217055FF} - ชื่อจะเป็นชื่ออย่าง "Java 7 Update 55" - สิ่งนี้จะมีลักษณะที่รายการ Win32_Product และค้นหาโปรแกรมที่ตรงกับ IdentifyingNumbers ที่แสดงรายการอยู่ในไฟล์ข้อความแทนชื่อเนื่องจากชื่ออาจลงท้ายด้วยผลบวกปลอม
ทิมพี

คำตอบ:


1

เนื่องจาก$javaตัวแปรแล้วมี IdentifyingNumber msiexecเพียงแค่ใช้มันโดยตรงกับ

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

นี่คือการค้นพบที่ดี ฉันต้องเรียกใช้ cmd / c อย่างไรก็ตามเนื่องจากกระบวนการล้มเหลวหากมีการติดตั้ง Java มากกว่าหนึ่งครั้งเนื่องจากข้อเท็จจริงที่ว่ามันไม่รอ ดังนั้นฉันจะทำ cmd / c เริ่มต้น / รอ ... และอื่น ๆ ฉันซาบซึ้งในความช่วยเหลือสิ่งนี้ทำให้เร็วขึ้นมาก
ทิมพี

1
@ เวลาคุณทำไม่ได้Start-Process -Waitแทนที่จะโทรหา cmd.exe
dangph

0

ดังที่ @dangph กล่าวว่านี่คือรหัส PowerShell ด้านล่างดังนั้นคุณไม่ต้องเรียกCMD /Cคำสั่งและตอนนี้ผู้ใช้จะต้องกรอกตัวแปรแทนการเล่นด้วยไวยากรณ์เช่นกัน

มันไม่ใช่การเปลี่ยนแปลงที่ฉันรู้ แต่ผู้ใช้ไม่ต้องกังวลกับการทำให้สคริปต์ยุ่งเหยิงซึ่งอาจจะไม่เป็นไรหากพวกเขาจำเป็นต้องเปลี่ยนสคริปต์บ่อยๆเหมือนกับที่ฉันทำกับสคริปต์ของฉัน

$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
}

แน่นอนว่า @DavidPostill ผู้ใช้ในตอนนี้จะต้องกรอกตัวแปรแทนการเล่นด้วยไวยากรณ์เช่นกัน มันไม่ใช่การเปลี่ยนแปลงที่ฉันรู้ แต่ผู้ใช้ (ถ้าใหม่สำหรับ PowerShell และจำไว้ว่าคำตอบนี้ไม่เพียง แต่สำหรับคนที่ถาม แต่ใครก็ตามที่เจอคำถามนี้) ไม่ต้องกังวลเกี่ยวกับการทำลายสคริปต์ที่ อาจจะไม่เป็นไรถ้าพวกเขาจำเป็นต้องเปลี่ยนสคริปต์บ่อยๆอย่างที่ฉันทำกับสคริปต์ของฉัน
Random206

@DavidPostill แน่นอนว่าไม่มีปัญหา :)
สุ่ม

ฉันทำการแก้ไขบน iPhone ของฉันผ่านทางแอพดังนั้นไม่แน่ใจว่ามันมีเลย์เอาต์ที่ยุ่งเหยิงและโค้ดบล็อกขอโทษ
Random206

-1

คุณสามารถแยกแต่ละรายการในอินสแตนซ์ PowerShell ของตนเอง วิธีแก้ปัญหาที่ฉันให้น่าจะเป็นทรัพยากรที่เข้มข้นที่สุด (FYI) ฉันไม่ต้องการเครดิตสำหรับงานของผู้อื่นดังนั้นฉันจะเชื่อมโยงตัวอย่างสคริปต์ที่มีให้ที่นี่

คุณสามารถสร้างตัวอย่างเป็นฟังก์ชั่นแล้วทำซ้ำฟังก์ชันภายในforeachวงของคุณ


2
ถอนการติดตั้ง / ถอนการติดตั้ง MSI เดียวเท่านั้นที่สามารถทำงานได้ในครั้งเดียว การแยกอินสแตนซ์ที่แยกจากกันจะนำไปสู่การชนกัน
EBGreen

@ebgreen ไม่อยู่ใน windows 7
Colyn1337
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.