powershell - Vent indtil et program er færdigt, inden du starter næste i Windows Script

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skal finde uninstallers i alle undermapper i en bestemt mappe. Når uninstaller er fundet, skal jeg køre den.


@setlocal enabledelayedexpansion
@for /r \%\%i in ( un*.exe) do (
        @echo Found file: \%\%~nxi            

        \%\%i             
        )


Jeg kan allerede søge underkatalogerne og finde afinstallationsprogrammerne i dem ved hjælp af koden ovenfor.


PROBLEM: Kommandoen \%\%i udfører uninstaller.exe og kontrollen vender straks tilbage til kommandoprompten. På grund af den øjeblikkelige tilbagevenden af ​​kontrol til kommandoprompten udføres den næste iteration af for-loop og derfor startes den næste afinstalleringsenhed (ved kommando \%\%i også.


Hvad jeg har brug for: Jeg vil forblive i den aktuelle iteration af for-loop, indtil afinstalleringen startet af kommandoen \%\%i er færdig.


PS: Afinstalleringsprogrammerne afsluttes ikke af sig selv. De beder om et par muligheder og derfor vil jeg starte dem en efter en (så brugeren ikke bliver forvirret).


PS-2: Som påpeget i en af ​​nedenstående bemærkninger, at PowerShell kan løse problemet, så søger jeg også flere forslag fra PowerShell-fællesskabet.

Bedste reference


Forudsat at du vil 1) Find alle filer med navnet un*.exe i en bestemt sti og dens underkataloger, 2) udfør hver enkelt og 3) vent på, at hver eksekverbar er færdig, inden du udfører den næste, kan du skrive noget som dette i PowerShell:


Get-ChildItem "C:Uninstaller Pathun*.exe" -Recurse | ForEach-Object {
  Start-Process $\_ -Wait
}

Andre referencer 1


du kan bruge start /wait. Sammenlign følgende to linjer:


for \%\%i in (*.txt) do notepad "\%\%i"

for \%\%i in (*.txt) do start /wait notepad "\%\%i"


Den første vil åbne alle matchende filer i flere Notesblok, den anden åbner kun det næste Notesblok, når du lukker den forrige.