|I l@ve RuBoard|
7.16 Working with Windows Scripting Host (WSH) from Python
Credit: Kevin Altis
import sys, win32com.client shell = win32com.client.Dispatch("WScript.Shell")
Then, we launch Notepad to edit this script in the simplest way (basically, with the same functionality as os.system). This script's name is, of course, sys.argv, since we're driving from Python:
shell.Run("notepad " + sys.argv)
For a .pys script driven from WSH, it would be WScript.ScriptFullName instead. shell.Run has greater functionality than the more portable os.system. To show it off, we can set the window type, wait until Notepad is shut down by the user, and get the code returned from Notepad when it is shut down before proceeding:
ret = shell.Run("notepad " + sys.argv, 1, 1) print "Notepad return code:", ret
Now, we open a command window, change the path to C:\, and execute a dir:
shell.Run("cmd /K CD C:\ & Dir")
Note that cmd works only on Windows NT/2000/XP; on Windows 98/ME, you need to run Command instead, and this does not support the & joiner to execute two consecutive commands. The shell object has many more methods besides the Run method used throughout this recipe. For example, we can get any environment string (similar to accessing os.environ):
This recipe shows three Windows Scripting Host (WSH) examples converted to Python. WSH documentation can be found at http://msdn.microsoft.com/library/en-us/script56/html/wsoriWindowsScriptHost.asp.
Note that this recipe shows a Python program driving WSH, so save the code to a file with extension .py rather than .pys. Extension .pys would be used if WSH was driving (i.e., via cscript.exe)梐nd, thus, if Python was being used via the ActiveScripting protocol. But the point of the recipe is that you don't need to rely on ActiveScripting: you can use WSH system-specific functionality, such as SendKeys and ExpandEnvironmentStrings, from within a regular Python program, further enhancing the use of Python for system administration and automating tasks in a Windows environment.
Note that you do not need to worry about closing the COM objects you create. Python's garbage collection takes care of them quite transparently. For example, if and when you want to explicitly close (release) a COM object, you can use a del statement (in this case, you need to ensure that you remove or rebind all references to the COM object that you want to release).
7.16.4 See Also
Documentation for pythoncom and win32com.client in win32all (http://starship.python.net/crew/mhammond/win32/Downloads.html) or ActivePython (http://www.activestate.com/ActivePython/); Windows API documentation available from Microsoft (http://msdn.microsoft.com); Python Programming on Win32, by Mark Hammond and Andy Robinson (O'Reilly).
|I l@ve RuBoard|