Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

SendKeys to cmd.exe

500 views
Skip to first unread message

jm

unread,
Mar 22, 2008, 6:00:01 PM3/22/08
to
I can pass text to calc or notepad, but the same is not true for cmd or
winword i.e. FIGURE1(calc) works perfect. FIGURE2(cmd) is a no go. Well it
does at least open a command window or winword but will pass NO text…

If you have a moment – Thanks.

FUGURE1
Shell = newobject –com WScript.Shell
[void] $shell.Run(“calc”)

Start-sleep 1
If ($shell.AppActivate(“Calculator”))
{
“Calculator activated…”
Start-sleep 1
$shell.SendKeys(“10{+}”)
Start-sleep 1
$shell.SendKeys(“15”)
Start-sleep 1
$shell.SendKeys(“~”)
Start-sleep 1
$shell.SendKeys(“%F4”)
}

FIGURE2
Shell = newobject –com WScript.Shell
[void] $shell.Run(“cmd”)

Start-sleep 1
If ($shell.AppActivate(“cmd”))
{
“cmd activated…”
Start-sleep 1
$shell.SendKeys(“delete c:\temp\jess\*.*”)
Start-sleep 1
$shell.SendKeys(“~”)
Start-sleep 1
$shell.SendKeys(“y”)
Start-sleep
$shell.SendKeys(“~”)
Start-sleep 1
$shell.SendKeys(“exit”)
}

Shay Levi

unread,
Mar 22, 2008, 7:01:48 PM3/22/08
to

Hi

FIGURE2 doesn't work because the AppActivate methos expects the cmd window
title. On my machine it's
invoked with the path of system32 in the title. Updating the AppActivate
argument runs the script without a problem.
You can also unify some keystrokes:


$shell = new-object –com wscript.shell


[void] $shell.Run("cmd")
Start-sleep 1

If ($shell.AppActivate("c:\windows\system32"))
{
Start-sleep 1
$shell.SendKeys("del c:\scripts\temp\*.*~")

Start-sleep 1
$shell.SendKeys("y~")

Start-sleep 1
$shell.SendKeys("exit~")
}


Keep in mind that this is not a secure method, it'll most likely fail most
of he time due to the delete operation time length and the sleep intervals.
Why don't you delete the files with remove-item:

dir c:\scripts\temp\*.* | remove-item -force


-----
Shay Levi
$cript Fanatic
http://scriptolog.blogspot.com

RichS

unread,
Mar 22, 2008, 7:53:00 PM3/22/08
to
If you want to send key strokes through PowerShell have a look at Windows
Automation for PowerShell at
http://www.codeplex.com/WASP/Release/ProjectReleases.aspx?ReleaseId=9323

it will probably do what you want with out dropping back to the VBScript
objects
--
Richard Siddaway
Please note that all scripts are supplied "as is" and with no warranty
Blog: http://richardsiddaway.spaces.live.com/
PowerShell User Group: http://www.get-psuguk.org.uk

jm

unread,
Mar 22, 2008, 9:17:00 PM3/22/08
to
Hi Shay,
Thanks for the reply.
First off, all I need to do now is sendkey a "y" for yes and "enter".
I am new to scripting so I may be doing something wrong but I cannot get
this to work even with your code. I am going to try it on a non-vista
machine just in case that's an issue. When I open cmd on my computer, it
says this exactly: Administrator: C:\Windows\System32\cmd.exe
So I modified my script exactly like your changing the above to:

If ($shell.AppActivate("c:\windows\system32"))
If ($shell.AppActivate("c:\windows\system32\"))
If ($shell.AppActivate("c:\windows\system32\cmd.exe"))
If ($shell.AppActivate("administrator c:\windows\system32\cmd.exe"))

But none worked. Here is my exact code with how I believe it should work.


$shell = new-object –com wscript.shell
[void] $shell.Run("cmd")

Start-sleep 2
If ($shell.AppActivate("C:\Windows\System32"))
{
Start-sleep 2
$shell.SendKeys("dir~")
Start-sleep 2
$shell.SendKeys("y~")
Start-sleep 2
$shell.SendKeys("exit~")
#$shell.SendKeys("%{F4}")
}

Thanks,

CodeTestDummy

unread,
Mar 22, 2008, 11:18:52 PM3/22/08
to
Try setting the name of the command prompt. Set the name to something
Unique. Try this:

$AppName = "My Unique Command Prompt Name"
$Shell = new-object -comobject WScript.Shell
[void] $shell.Run("cmd /k title " + $AppName, 1, $False)

$AppReady = $false

# Loop until you find the your app
while($AppReady -eq $False)
{
Start-Sleep 1
$AppReady = $shell.AppActivate($AppName)
}

If ($shell.AppActivate($AppName))
{
Write-Host "Found"
Start-sleep 1
$shell.SendKeys("ipconfig")
$shell.SendKeys("~")
$shell.SendKeys("exit")
Start-sleep 3
$shell.SendKeys("~")
}
else{Write-Host "App not found"}

"jm" <j...@discussions.microsoft.com> wrote in message
news:4B1D0469-9E25-490B...@microsoft.com...


>I can pass text to calc or notepad, but the same is not true for cmd or
> winword i.e. FIGURE1(calc) works perfect. FIGURE2(cmd) is a no go. Well
> it

> does at least open a command window or winword but will pass NO text.
>
> If you have a moment - Thanks.
>
> FUGURE1
> Shell = newobject -com WScript.Shell


> [void] $shell.Run("calc")
>
> Start-sleep 1
> If ($shell.AppActivate("Calculator"))
> {

> "Calculator activated."


> Start-sleep 1
> $shell.SendKeys("10{+}")
> Start-sleep 1
> $shell.SendKeys("15")
> Start-sleep 1
> $shell.SendKeys("~")
> Start-sleep 1
> $shell.SendKeys("%F4")
> }
>
> FIGURE2

> Shell = newobject -com WScript.Shell


> [void] $shell.Run("cmd")
>
> Start-sleep 1
> If ($shell.AppActivate("cmd"))
> {

> "cmd activated."

Shay Levi

unread,
Mar 23, 2008, 4:55:38 AM3/23/08
to
JM,

Automating CMD can be very tricky. If your command has a PowerShell or even
VBScript version then I would use it.
Nonetheless, try to be more specific, what is your end goal?

0 new messages