Search code examples
powershellutilitystart-process

Application doesn't get triggered from Powershell script, when invoking inside Do...Until


I am trying to build custom Windows System Utility script which offers some tasks with relevant keypress choices.

For cleanup task, I am trying to invoke CCleaner64.exe from this script, with it's correct switches as mentioned here. And the script I built so far is below:

$ScriptDir = Split-Path $MyInvocation.MyCommand.Path
if (-Not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {
    if ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) {
        $CommandLine = "-File `"" + $MyInvocation.MyCommand.Path + "`" " + $MyInvocation.UnboundArguments
        Start-Process -FilePath PowerShell.exe -Verb Runas -ArgumentList $CommandLine
        Exit
    }
}
Set-Location $ScriptDir; Echo 'Current Directory: ' + (Get-Location | Out-String)

function SysUtilMenu {
    param (
        [string]$Title = 'Windows System Utility'
    )
    Clear-Host
    Write-Host "============ $Title ==========="
    Write-Host "1: Do task 1 here."
    Write-Host "2: Cache/Temp Files Cleanup."
    Write-Host "Q: Exit this Application."
}

Do
{
    SysUtilMenu
    $selection = Read-Host "Press key to run given task..."
    switch ($selection)
    {
        '1' {
            ## Do task 1 here...
        } '2' {
            $CclnrApp64 = "$Env:ProgramFiles\CCleaner\CCleaner64.exe"
            Start-Process $CclnrApp64 -ArgumentList '/Clean'
            Start-Process $CclnrApp64 -ArgumentList '/Registry'
        }
    }
}
Until($selection -eq 'q')

But when I press '2', it doesn't invoke CCleaner64.exe in the taskbar, which I checked.

I don't get, why the same Start-Process line doesn't work in that script, but if I open the Powershell terminal separately and run below commands one-by-one, it works perfectly ?

$CclnrApp64 = "$Env:ProgramFiles\CCleaner\CCleaner64.exe"
Start-Process $CclnrApp64 -ArgumentList '/Clean'

Is it due to Script's Self-Elevation, I have taken care of setting the location of the script instead of C:\Windows\System32.

Suggestion with detailed explanation is greatly appreciated...


Solution

  • From the link you have added, the documentation under Command-line parameters for CCleaner operation pane focus, it says the switch should be /CLEANER, not /Clean, and since your code also shows the switch /Registry, I thought this is what you were after (to open the app on a particular tab page).

    My initial thoughts were:

    • it is possible you need to add the -Wait switch so PowerShell will ony start the second command after the first one has completed.
      so the ful command would be Start-Process -FilePath "$CclnrApp64" -ArgumentList '/Cleaner' -Wait

    • to try and use the call operator & instead of Start-Process like & "$CclnrApp64" "/CLEANER"

    Both above have the paths in variable $CclnrApp64 in between quotes because $env:programfiles will usually expand to C:\Program Files which has a space in the path.

    Under Command-line parameters for CCleaner Business and Technician Edition, there is also a switch called /Clean If you have that version, the switch should clean up using whatever rules are rules defined in ccleaner.ini and optionally puts the results in log_filename.txt

    However, on that same CCleaner page, there is also a listing of other parameters, especially for use in a commandline and as you have experimented using the /AUTO switch, it appears this is what you were after: CCleaner runs silently and automatically, using the current set of saved options to clean the PC. CCleaner then exits.

    A note about the /AUTO switch though: When you run CCleaner.exe using the /AUTO parameter, CCleaner does not run the Registry cleaner. You cannot currently run the Registry cleaner through a command-line parameter

    All this means there are several switches you can use with CCleaner, but they all serve a different purpose.

    • /CLEANER, /REGISTRY, /TOOLS and /OPTIONS are for opening the application at a certain pane
    • /AUTO (with optional /SHUTDOWN), /EXPORT and /DELETE (with optional /METHOD) are to have the application perform cleaning/delete actions

    and for the Business and Technician Edition there is also

    • /analyze, /clean and /update