Matrix2008
Matrix2008

Reputation: 51

Is there a way to pre-fill out Read-Host in Powershell?

I have a script that helps a user find if a file hash exists in a folder. After the user has entered the hash I determine what type of hash it is and if it is not supported or if the user missed a letter it will return to asking for a hash. For ease of use I want to be able to pre-fill out what the user had type in the previously so they do not need to start over.

while (1)
{
    $hashToFind = Read-Host -Prompt "Enter hash to find or type 'file' for multiple hashes"
    # Check if user wants to use text file
    if ($hashToFind -eq "file" )
    {

        Write-Host "Be aware program will only support one has type at a time. Type is determined by the first hash in the file." -ForegroundColor Yellow
        Start-Sleep -Seconds 3
        $hashPath = New-Object system.windows.forms.openfiledialog
        $hashPath.InitialDirectory = “c:\”
        $hashPath.MultiSelect = $false
        if($hashPath.showdialog() -ne "OK")
        {
            echo "No file was selected. Exiting program."
            Return
        }
        $hashToFind = Get-Content $hashPath.filename
    }

    # Changes string to array
    if ( $hashToFind.GetTypeCode() -eq "String")
    {
        $hashToFind+= " a"
        $hashToFind = $hashToFind.Split(" ")
    }

    if ($hashToFind[0].Length -eq 40){$hashType = "SHA1"; break}
    elseif ($hashToFind[0].Length -eq 64){$hashType = "SHA256"; break}
    elseif ($hashToFind[0].Length -eq 96){$hashType = "SHA384"; break}
    elseif ($hashToFind[0].Length -eq 128){$hashType = "SHA512"; break}
    elseif ($hashToFind[0].Length -eq 32){$hashType = "MD5"; break}
    else {echo "Hash length is not of supported hash type."}
}

I am newer to PowerShell so if there are any other comments they are welcome!

Upvotes: 5

Views: 3494

Answers (2)

Matthieu
Matthieu

Reputation: 3097

From Super User:

[System.Windows.Forms.SendKeys]::SendWait("yes")
Read-Host "Your answer"

As noted by @jing, the SendKeys class kind of simulates keyboard strokes so they will be directed to whatever window that currently holds focus. Therefore, don't rely on it as a reliable way to automate stuff.

Upvotes: 5

Kirill Pashkov
Kirill Pashkov

Reputation: 3236

I have came up with solution like this:

while (1)
    {
        $hashToFind = Read-Host -Prompt "Enter hash to find or type 'file' for multiple hashes. Enter 'R' for reply input"

        if ($hashToFind -eq 'R' -and $PreviousInput)
        {
            $handle = (Get-Process -Id $PID).MainWindowHandle

            $code = {
            param($handle,$PreviousInput)
            Add-Type @"
      using System;
      using System.Runtime.InteropServices;
      public class Tricks {
         [DllImport("user32.dll")]
         [return: MarshalAs(UnmanagedType.Bool)]
         public static extern bool SetForegroundWindow(IntPtr hWnd);
      }
    "@
            [void][Tricks]::SetForegroundWindow($handle)
            Add-Type -AssemblyName System.Windows.Forms
            [System.Windows.Forms.SendKeys]::SendWait($PreviousInput)
            }

            $ps = [PowerShell]::Create()
            [void]$ps.AddScript($code).AddArgument($handle).AddArgument($PreviousInput)
            [void]$ps.BeginInvoke()
        }

        $PreviousInput = $hashToFind

        # Check if user wants to use text file
        if ($hashToFind -eq "file" )
        {
            $PreviousInput = $null

            Write-Host "Be aware program will only support one has type at a time. Type is determined by the first hash in the file." -ForegroundColor Yellow
            Start-Sleep -Seconds 3
            $hashPath = New-Object system.windows.forms.openfiledialog
            $hashPath.InitialDirectory = “c:\”
            $hashPath.MultiSelect = $false
            if($hashPath.showdialog() -ne "OK")
            {
                echo "No file was selected. Exiting program."
                Return
            }
            $hashToFind = Get-Content $hashPath.filename
        }

        # Changes string to array
        if ( $hashToFind.GetTypeCode() -eq "String")
        {
            $hashToFind+= " a"
            $hashToFind = $hashToFind.Split(" ")
        }

        if ($hashToFind[0].Length -eq 40){$hashType = "SHA1"; break}
        elseif ($hashToFind[0].Length -eq 64){$hashType = "SHA256"; break}
        elseif ($hashToFind[0].Length -eq 96){$hashType = "SHA384"; break}
        elseif ($hashToFind[0].Length -eq 128){$hashType = "SHA512"; break}
        elseif ($hashToFind[0].Length -eq 32){$hashType = "MD5"; break}
        else {echo "Hash length is not of supported hash type."}
    }

Upvotes: -1

Related Questions