2

I'm new to PowerShell. Now the task is to pin some programs to the Taskbar. This Tutorial is great and runs well in one of my Win7 32bit in Vmware. But same script cannot run in Win10 32bit in Vmware. So I modified the code and finally found it was because some Verbs are not found. My test code is as following:

CLS
$cmd = 'C:\Windows\System32\cmd.exe'
Test-Path $cmd
$Shell = New-Object -ComObject Shell.Application
$Desktop = $Shell.NameSpace(0X0)
$itemLnk = $Desktop.ParseName($cmd)
$itemVerbs = $itemLnk.Verbs()
Foreach($v in $itemVerbs)
{
    write-host $v.Name
}

The ISE is run as admin and the result, as well as 'Verbs' found by mannually right clicking the cmd.exe, are shown as below: enter image description here enter image description here

So please tell me why and how to fix this, thank you!

2
  • Please share your whole code. eg. what is $item? Commented May 27, 2016 at 7:07
  • @jisaak it was a typo, and I just updated, please check. Commented May 27, 2016 at 7:14

2 Answers 2

1

Its probably because there is no cmd.exe located in C:\Windows\, use this instead:

$cmd = Join-Path $env:SystemRoot 'System32\cmd.exe'

Note: Im using the Join-Path cmdlet to combine the path and $env:SystemRoot to retrieve the system root (e. g. C:\Windows)

Sign up to request clarification or add additional context in comments.

5 Comments

I'm not that silly. I had used SystemRoot in my script, I use C: just to put least code here!
Read my answer. Its not due to the wrong systemRoot, its because of the missing system32 subfolder...
are you sure that $cmd is now a valid path? You can check it using Test-Path $cmd
Thanks, I'll check the site later. Nevertheless, I can pin to Start, which is also OK. Thank you for answering my question.
0

You can only use verbs above the first separator and Properties. Your program must keep running to display properties.

Here's a VBScript that list and performs the verb. ShVerb.vbs /? to read the above.

HelpMsg = vbcrlf & "  ShVerb" & vbcrlf & vbcrlf & "  2014" & vbcrlf & vbcrlf & "  Lists or runs an explorer verb (right click menu) on a file or folder" & vbcrlf  & vbcrlf & "    ShVerb <filename> [verb]" & vbcrlf & vbcrlf & "  Used without a verb it lists the verbs available for the file or folder" & vbcrlf & vbcrlf
HelpMsg = HelpMsg & "  The program lists most verbs but only ones above the first separator" & vbcrlf & "  of the menu work when used this way" & vbcrlf & vbcrlf 
HelpMsg = HelpMsg & "  The Properties verb can be used. However the program has to keep running" & vbcrlf & "  to hold the properties dialog open. It keeps running by displaying" & vbcrlf & "  a message box." 
Set objShell = CreateObject("Shell.Application")
Set Ag = WScript.Arguments 
set WshShell = WScript.CreateObject("WScript.Shell") 
Set fso = CreateObject("Scripting.FileSystemObject")

    If Ag.count = 0 then 
        wscript.echo "  ShVerb - No file specified"
        wscript.echo HelpMsg 
        wscript.quit
    Else If Ag.count = 1 then 
        If LCase(Replace(Ag(0),"-", "/")) = "/h" or Replace(Ag(0),"-", "/") = "/?" then 
            wscript.echo HelpMsg 
            wscript.quit
        End If
    ElseIf Ag.count > 2 then 
        wscript.echo vbcrlf & "  ShVerb - To many parameters" & vbcrlf & "  Use quotes around filenames and verbs containing spaces"  & vbcrlf
        wscript.echo HelpMsg 
        wscript.quit
    End If

    If fso.DriveExists(Ag(0)) = True then
        Set objFolder = objShell.Namespace(fso.GetFileName(Ag(0)))
'       Set objFolderItem = objFolder.ParseName(fso.GetFileName(Ag(0)))
        Set objFolderItem = objFolder.self
        msgbox ag(0)
    ElseIf fso.FolderExists(Ag(0)) = True then
        Set objFolder = objShell.Namespace(fso.GetParentFolderName(Ag(0)))
        Set objFolderItem = objFolder.ParseName(fso.GetFileName(Ag(0)))
    ElseIf fso.fileExists(Ag(0)) = True then
        Set objFolder = objShell.Namespace(fso.GetParentFolderName(Ag(0)))
        Set objFolderItem = objFolder.ParseName(fso.GetFileName(Ag(0)))
    Else
        wscript.echo "  ShVerb - " & Ag(0) & " not found"
        wscript.echo HelpMsg 
        wscript.quit
    End If

    Set objVerbs = objFolderItem.Verbs

    'If only one argument list verbs for that item

    If Ag.count = 1 then
        For Each cmd in objFolderItem.Verbs
            If len(cmd) <> 0 then CmdList = CmdList & vbcrlf & replace(cmd.name, "&", "") 
        Next
        wscript.echo mid(CmdList, 2)

    'If two arguments do verbs for that item

    ElseIf Ag.count = 2 then
        For Each cmd in objFolderItem.Verbs
            If lcase(replace(cmd, "&", "")) = LCase(Ag(1)) then 
                wscript.echo(Cmd.doit)
                Exit For
            End If
        Next
    'Properties is special cased. Script has to stay running for Properties dialog to show.
        If Lcase(Ag(1)) = "properties" then
            WSHShell.AppActivate(ObjFolderItem.Name & " Properties")
            msgbox "This message box has to stay open to keep the " & ObjFolderItem.Name & " Properties dialog open."
        End If  
    End If
End If

4 Comments

Sorry, the question is about powershell.
No the question is about the windows shell COM interface. And as the code above explains, which is the same as your powershell code, what verbs you can and cannot use. Basically you can't use Context Menu Extensions or internal commands like Cut etc. If you run the program it tells you the verbs you can use.
So you've explained why, but how?
Only the ones at the top of the menu, that aren't context menu extensions, can be run.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.