Index: wp-testlib/base.php
===================================================================
--- wp-testlib/base.php	(revision 297)
+++ wp-testlib/base.php	(working copy)
@@ -393,8 +393,9 @@
 	 */
 	function isTracTicketClosed($trac_url, $ticket_id) {
 		#TODO: cache it
-		$trac_url = rtrim($trac_url, '/');
-		$ticket_tsv = file_get_contents("$trac_url/ticket/$ticket_id?format=tab");
+		$trac_url   = rtrim($trac_url, '/');
+		$url        = sprintf('%s/ticket/%s?format=tab', $trac_url, $ticket_id);
+		$ticket_tsv = file_get_contents($url);
 		if (false === $ticket_tsv) {
 			return null;
 		}
@@ -410,32 +411,41 @@
 		$tabs = explode("\t", $lines[1]);
 		return 'closed' === $tabs[$status_idx];
 	}
+	
+	/**
+	 * Skips the current test if there is an open ticket in a trac
+	 * based bug-tracker
+	 * 
+	 * @param string $trac_domain domain name of trac webapplication
+	 * @param string $ticket_id ticket id
+	 * @return void
+	 */
+	private function _knownBugTrac($trac_domain, $ticket_id) {
+		if ( !TEST_FORCE_KNOWN_BUGS 
+		     && (TEST_SKIP_KNOWN_BUGS || !$this->isTracTicketClosed( 'http://' . $trac_domain, $ticket_id )) ) {
+			$this->markTestSkipped();
+		}
+	}
 
 	/**
 	 * Skips the current test if there is open WordPress ticket with id $ticket_id
 	 */
 	function knownWPBug($ticket_id) {
-		if (!TEST_FORCE_KNOWN_BUGS && (TEST_SKIP_KNOWN_BUGS || !$this->isTracTicketClosed('http://trac.wordpress.org', $ticket_id))) {
-			$this->markTestSkipped();
-		}
+		$this->_knownBugTrac('trac.wordpress.org', $ticket_id);
 	}
 
 	/**
 	 * Skips the current test if there is open WordPress MU ticket with id $ticket_id
 	 */
 	function knownMUBug($ticket_id) {
-		if (!TEST_FORCE_KNOWN_BUGS && (TEST_SKIP_KNOWN_BUGS || !$this->isTracTicketClosed('http://trac.mu.wordpress.org', $ticket_id))) {
-			$this->markTestSkipped();
-		}
+		$this->_knownBugTrac('trac.mu.wordpress.org', $ticket_id);
 	}
 
 	/**i
 	 * Skips the current test if there is open plugin ticket with id $ticket_id
 	 */
 	function knownPluginBug($ticket_id) {
-		if (!TEST_FORCE_KNOWN_BUGS && (TEST_SKIP_KNOWN_BUGS || !$this->isTracTicketClosed('http://dev.wp-plugins.org', $ticket_id))) {
-			$this->markTestSkipped();
-		}
+		$this->_knownBugTrac('dev.wp-plugins.org', $ticket_id);
 	}
 
 	// convenience function: return the # of posts associated with a tag
@@ -513,17 +523,32 @@
 	echo "\n\nUse -t TestCaseName to run individual test cases\n";	
 }
 
-function wptest_run_tests($classes, $classname='') {
-	$suite = new PHPUnit_Framework_TestSuite();
-	foreach ($classes as $testcase)
-		if (!$classname or strtolower($testcase) == strtolower($classname)) {
+function wptest_run_tests($classes, $filter='') {
+	$suite  = new PHPUnit_Framework_TestSuite();
+	
+	$filter_do = (bool) strlen($filter);
+	$filter_ok = true;
+	if ($filter_do) {
+		if ('!' == $filter[0]) {
+			$filter = substr($filter, 1);
+			$filter_ok = false;
+		}
+		$filter_classes = explode(',',$filter);
+		$filter_classes = array_map('strtolower', $filter_classes);
+		$filter_classes = array_map('trim', $filter_classes);
+	}	
+	
+	foreach ($classes as $testcase) {		
+		$match = $filter_do ? in_array(strtolower($testcase), $filter_classes) : true;
+		$add   = $filter_ok ? $match : !$match;		 
+		if ($add)
 			$suite->addTestSuite($testcase);
-		}
+	}
 
 	#return PHPUnit::run($suite);
 	$result = new PHPUnit_Framework_TestResult;
 	require_once('PHPUnit/TextUI/ResultPrinter.php');
-	$printer = new PHPUnit_TextUI_ResultPrinter(NULL,true,true);
+	$printer = new PHPUnit_TextUI_ResultPrinter( NULL, true, $colors = !((bool) stristr(PHP_OS, 'WIN')) );
 	$result->addListener($printer);
 	return array($suite->run($result), $printer);
 }
Index: wp-test.cmd
===================================================================
--- wp-test.cmd	(revision 0)
+++ wp-test.cmd	(revision 0)
@@ -0,0 +1,3 @@
+@ECHO OFF
+php wp-test.php %*
+pause
\ No newline at end of file
