Hello all! Like most, I experience the Windows Explorer bug, which locks up the start button, and charms bar (why MS hasn't fixed it? Who knows...) Anyways, I'm well aware that Winaero (Sergey Tkachenko), has already made a tool that restarts Windows Explorer for this exact same purpose. However, his tool is slow. (In my opinion) it performs unnecessary operations that takes Windows Explorer a good 10-15 seconds to restarts. My simple VBScript bypasses all this crap, and just terminates the process, then restarts it. However, the VBS relies on a batch file to kill the process. Is there anyway in VB to create a folder in PD (ProgramData), and then extract a file to said folder? I'd like to keep this one, simple, executable and not make it an installer if possible. Any help is appriciated Thanks a lot guys! SwampFox
There should be no need to write a batch file, create a directory, extract the batch file to that directory and then run it from a visual basic script just to restart Windows Explorer. BTW, I would use PowerShell for this task: RestartExplorer.ps1 Code: ForEach ($oItem In PS) { If ($oItem.ProcessName -Eq 'explorer') { SpPs $oItem.ID -Force } } $Rkey = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon' If ((GP $RKey -Name AutoRestartShell | Select -ExP AutoRestartShell) -NE 1) { SaPs explorer.exe }
Thanks for the info. I've been trying to switch to powershell scripting - but having used Windows since 95 came out, I know all the DOS commands by heart. I know powershell is more... well... powerful, but I don't want to relearn all the commands :/ I should... Anyways, I'm using VB to execute the batch script 'silently'. If you perform a 'taskkill' on any process with a batch script - the window remains open. The point of using VB was to execute the script, without leaving the CMD window open. Plus - In the end, I want it to be one executable file. Preferably in the sense that the exe creates a temp folder that extracts the batch script to it, then executes the batch file.
You could write the powershell script to temp PS1, execute the PS! and delete afterwards . Spoiler Code: set "restart=%temp%\RestartExplorer.ps1" echo ForEach ^($oItem In PS^) { If ^($oItem.ProcessName -Eq 'explorer'^) {>%restart% echo SpPs $oItem.ID -Force } }>>%restart% echo $Rkey = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon'>>%restart% echo If ^(^(GP $RKey -Name AutoRestartShell ^| Select -ExP AutoRestartShell^) -NE 1^) {>>%restart% echo SaPs explorer.exe }>>%restart% powershell -executionpolicy bypass -file %restart% if exist "%restart%" del /s /q "%restart%" >nul
That's a pretty good idea actually. Only issue is, I plan to release this tool to the community... name it something like (quick shell restart). No bulls**t. No saving program states. Just kill the damn process and re-execute. Do you know of a way to wrap powershell scripts into executable files? Like I said above - to make this program simple and easy for anyone to use; I'd really like it to be just a simple .exe
As I've already stated, you shouldn't need to leave the .vbs to run a .cmd. Have you thought about possibly providing us with your current VBScript? (Otherwise it would appear that your intention is to release someone else's work to the community).
This did make me laugh a bit lol. If you want it, you can have it. As I said above, the point of using VB was to execute the batch file silently. Otherwise, no matter what (even if you put @echo off, or CMD /C at the beginning, or exit at the end, the Command Prompt stays open.). Restart Explorer.vbs Code: Set WshShell = CreateObject("WScript.Shell") WshShell.Run chr(34) & "C:\ProgramData\ShellRestart\Restart Explorer.bat" & Chr(34), 0 Set WshShell = Nothing Restart Explorer.bat Code: @echo off CMD /C taskkill /im explorer.exe /f explorer.exe EXIT In CMD I've tried many ways to get the command prompt to close by itself (goto, exit, cmd /c,) but the window refuses to close unless you close it yourself. For a public tool, I don't think that would be acceptable. Oh, and believe me. If I was copying someone elses code - it would be a little more advanced than mine. That's why I titled this thread 'NOVICE' scripting.
What would you expect this to do? script.vbs Code: Set objShell = CreateObject("WScript.Shell") comspec = objShell.ExpandEnvironmentStrings("%comspec%") objShell.Run(comspec & " /c taskkill /im explorer.exe /f"), 0, False
Of course it doesn't; I didn't ask it to! I wasn't giving you a complete and direct solution, I was showing you that there is no need for an 'nt command script' and 'vb script' and it isn't necessary to make directories and create temporary files. I also showed that the required process can be achieved without the console window appearing in the GUI. [EDIT] Additionally, if you were to carry on with your intention of running the 'nt command script', then the fact that you "know all of the DOS commands by heart" should mean that you've tried this too! xplora.cmd Code: @taskkill /im explorer.exe /f @start explorer You could go one step further with that too Code: @ECHO OFF & SETLOCAL SET "_MP=explorer.exe" :LOOP TASKLIST /FI "IMAGENAME eq %_MP%" | FIND /I "%_MP%" >NUL && ( TASKKILL /IM %_MP% /F >NUL & GOTO :LOOP) || (START %_MP%) This should open explorer if it isn't running, or otherwise restart it. [/EDIT]
I have to admit, I didn't try the below. If it works, I'll wrap it in an EXE and give you credit. Although I have my doubts. But what the heck! And with the VBS you posted above - I tried that before and the extra specified command (to reopen explorer.exe) but it always caused it to give me an error. Maybe I just did it wrong... who knows. I don't know VBS that well. I'll give it a go and see what happens.
Found the thread where they struggled with 'graceful' Explorer Restart : http://forums.mydigitallife.net/thr...eylogger/page4?p=960981&viewfull=1#post960981 some posts later there is a binary solution and soure from hb860 EDIT: Noticed you already know this . There is a nice soultion by Mr Jinje for Context Menu Entry to Restart Explorer. Example for cascaded context Menu 'TOOLS' with 'Restart Explorer by Mr Jinje': Code: reg add "HKCR\DesktopBackground\Shell\TOOLS" /v "MUIVerb" /t REG_SZ /d "TOOLS" /f reg add "HKCR\DesktopBackground\Shell\TOOLS" /v "SubCommands" /t REG_SZ /d "Restart_Explorer" /f reg add "HKCR\DesktopBackground\Shell\TOOLS" /v "Icon" /t REG_SZ /d "imageres.dll,220" /f reg add "HKCR\DesktopBackground\Shell\TOOLS" /v "Position" /t REG_SZ /d "top" /f reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\Restart_Explorer" /ve /t REG_SZ /d "Restart Explorer" /f reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\Restart_Explorer" /v "icon" /t REG_SZ /d "imageres.dll,-5339" /f reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\Restart_Explorer\Command" /ve /t REG_SZ /d "cmd /c start /b /wait powershell.exe -nologo -WindowStyle Hidden -sta -command \"$PAYLOAD = ^ 'H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/In7j5Dd^ Onq2X07aolumrvGmzuv39T9+tyqrO6/QX4+s39XX6i7+n343Nd9//mWrdbi/XZflL0mnWTufpL07R+ng2235zvcpT/vdpfl4sCwb+e35M36+bYnmRvr5u2nxxGP45PqnKMmdEmvHn+TKvi2m3yav1si0W^ +fhs2eZ1tXqd15fFNG8O0fEyW+TNKpvmZhi/cULor9aTspim0zJrmtTgzt987/Wb4zfzOs9m38fr33talmeLVVW3Wx+tm7y+tzeeleVHo/R13j7Pmva0rqs6/Sxt63V+5/sWMPXU0o/8HSG0TAmvl22dP^ iuWs+/S/6urraatgb/81ZwAjVEafPimaMv8Dg/he3Xeruvlo/SLrG7mWXncbH21XGTL7CKfgZrjJ1VVovP3RTbEckJQ0pdV036RNw3B3lK0599dzkbpuli26RfNxciM5uplVmcL+2fJfwrCIREuq2KWvq^ BB32ECn74rWkPxLbTXSRSiEwH0t/HrMs9XW3s7Ozteq6dFdrEkHItpM35ZVzTLzfg1pnXro1yBjvN3+Ud45ZfYETIKYceEiTe+N3V2TYTxZuij1/O8LH9/fEHfEw3B04DqU8i8Okp33t1/sm+IMf4pYs^ PgD0bnlxBCH/+ejBfNVU9yHj1SIuE/bkPTtn1cFlmTvjrtSeFvnLw6/X8AvD8vw6cDAAA=';^ $data = [System.Convert]::FromBase64String($PAYLOAD);$ms = New-Object System.IO.MemoryStream;$ms.Write($data, 0, $data.Length);$ms.Seek(0,0) ^| Out-Null;$cs = New-Object System.IO.Compression.GZipStream($ms, [System.IO.Compression.CompressionMode]::Decompress);$sr = New-Object System.IO.StreamReader($cs);$t = $sr.readtoend();Invoke-Expression $t;\"" /f http://forums.mydigitallife.net/attachment.php?attachmentid=32401&stc=1
^^ Personally - my context menu is cluttered enough as it is. Putting something there would honestly just be an inconvenience for me. But I finally got EXACTLY what I wanted! Using this as a reference - MSDN WMIServices I finally figured out how to get VB to restart explorer without the need for CMD commands. I used the below script to do this. Problem is, at the "Next" command, I kept getting 'Error at line 9 char 1" This was the script. Code: Dim objWMIService : Set objWMIService = GetObject ("winmgmts:") Dim ProcessList, Process Set ProcessList= objWMIService.ExecQuery _ ("Select * from Win32_Process Where Name ='explorer.exe' ") For Each process In ProcessList process.Terminate() Next objWMIService.Get ("Win32_Process").Create "explorer.exe" So I kept digging in the MSDN information and found that every statement needs to be 'explicit' - MSDN Source. Simple solution; add "Option Explicit" at the beginning of the script. Final VBS looks like this. Code: Option Explicit Dim objWMIService : Set objWMIService = GetObject ("winmgmts:") Dim ProcessList, Process Set ProcessList= objWMIService.ExecQuery _ ("Select * from Win32_Process Where Name ='explorer.exe' ") For Each process In ProcessList process.Terminate(1) Next objWMIService.Get ("Win32_Process").Create "explorer.exe" Formatted the code in Dreamweaver, and now it looks nice and pretty . Also, to keep Windows Explorer from restart automatically (and thus opening the 'My PC" explorer windows in addition to the shell) I added the the '1' in between the parentheses. This keeps windows from restarting the process. Once, I wrap this into an executable - I'll post it here for everyone
explicit statement isn't necessary… Code: On Error Resume Next strProcess = "explorer.exe" strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colProcessList = objWMIService.ExecQuery _ ("Select * from Win32_Process Where Name = '" & strProcess & "'") For Each objProcess in colProcessList objProcess.Terminate(1) Next Set objShell = CreateObject("Wscript.Shell") objShell.Run strProcess Set objShell = Nothing Wscript.Exit
I remember reading something that Set objWMIService = GetObject("winmgmts:") was the minimal required specification. I also remember reading that using windows management services couldn't be used with 'Impersonate' commands. But, then again, I'm new to programming with VB. If you could elaborate a bit and walk me through your VB script, I'd definitely appreciate it
Hmm ... is pure batch code, should definitely work in Win 7, and afaik in XP likewise. As you cannot harm your system that way ... test XP to be sure .
Thanks. Another ask. In my windows 8.1 I've two user account. One is Administrator and another is standard. I operate with standard in it's my default user account. When I use Run as Administrator to run your code, Explorer closes but doesn't restart again. I'm to run manually. But woks fine when run with standard. Any solution please?
You're 'barking' the wrong three for that . Script is by Compo, could only assume here, never tested this .
When checking my memory, i remember some members (Mr Jinje and hb860) discussing how to reliably and 'gracefully' kill Explorer and then restart. The way they used in my tests worked very well, whereas the method described by Compo often fails, due to timing issues. If Explorer.exe is started too shortly after the kill, Explorer Window pops up but not the Shell. For that reason i prefer the nice Context menu i posted earlier in this thread.