#!perl.exe use diagnostics; #use Env; use English; use strict; use vars qw( %env_vars %var_select $filename ); use warnings; use File::Basename; use IO::Handle; use IO::File; use Tk; use XML::Writer; use TK::FileDialog; use Win32::AdminMisc; =head1 NAME SaveWin32EnvVars - Script for setting the environment variables in Win32 =head1 SYNOPSIS SaveWin32EnvVars =head1 DESCRIPTION This script will save the environment variables on win32 platforms to an XML file. It should work on Win 2K and WinNT 4.0. It has not been tested on Win 9X and Win ME platforms. The script brings up a screen that lets you select the variables to save. =head1 MODULES USED Win32::AdminMisc File::Basename IO::Handle IO::File Tk TK::FileDialog XML::Writer =cut my $DEBUG = 1; # set to 0 to turn off debugging my $OVERWRITE = 2; # 0 - do not overwrite, 1 - overwrite, 2 - prompt my( $var, $def, $response, $old_value, $proceed ); my @sys_env_vars = ( "ComSpec", "Number_of_Processors", "OS", "PROCESSOR_ARCHITECTURE", "PROCESSOR_IDENTIFIER", "PROCESSOR_LEVEL", "PROCESSOR_REVISION", "Template", "windir", "Os2Lib" ); #turn on autoflush (required so that the print gets to the screen before #the read) STDOUT->autoflush( 1 ); Win32::AdminMisc::GetEnvVar( \%env_vars, ENV_SYSTEM ); SetupScreen(); # print %env_vars; #confirm before proceeding # print( "SetWin32EnvVars.pl\n" ); # print( "Following environment variables will be defined " ); # print( ", existing settings will be overwritten" ) if( $OVERWRITE == 1 ); # print( ".\n" ); # print( "\nDone ... \n"); exit 0; sub SetupScreen { my( $mw, $f, $t, $var, $l_var, $l_def, $c, $e, $bSave,$bBrowse, $bSelect, $bDeselect, $l, $fd ); $mw = MainWindow->new(); $mw->title( "Save System Environment Variables" ); $filename = "env_vars.xml"; $fd =$mw->FileDialog( -Create => 1, -Title => "Select Output File", -FPat => "*.xml", -SelDir => 0, -Horiz => 1, -Grab => 0, -Path => ".", -File => $filename ); $f = $mw->Frame()->pack( -expand => 1, -fill => 'x' ); $l = $f->Label( -text => "File Name: " ) -> grid( $e = $f->Entry( -textvariable => \$filename), $bBrowse = $f->Button( -text => "Browse", -command => sub { my $old_fname = $filename; $filename = $fd->Show(); if( !defined( $filename ) ) { $filename = $old_fname; }} ), $bSelect = $f->Button( -text => "Select All", -command => \&SelectAll ), $bDeselect = $f->Button( -text => "Deselect All ", -command => \&DeselectAll ), $bSave = $f->Button( -text => "Save", -command => [ \&SaveEnvVars, $filename ] ) ); $t = $mw->Scrolled( "Text", -wrap => 'none', -scrollbars => 'osoe' ) -> pack( -expand => 1, -fill => 'both' ); SelectAll(); foreach $var ( sort keys %env_vars ) { $c = $t->Checkbutton( -variable => \$var_select{ $var }, -cursor => 'arrow' ); $t->windowCreate( 'end', -window => $c ); $t->insert( 'end', " " ); $l_var = $t->Label( -relief => 'sunken', -width => 35, -text => $var ); $t->windowCreate('end', -window => $l_var ); $t->insert( 'end', " " ); $l_def = $t->Scrolled( "Label", -relief => 'sunken', -width => 50, -text => $env_vars{$var}, -anchor => 'w', -justify => 'left' , -wraplength => 300 ); $t->windowCreate('end', -window => $l_def ); $t->insert( 'end', "\n" ); } $t->configure( -state => 'disabled' ); $mw->configure( -height => 20, -width => 150 ); MainLoop; } sub SelectAll { foreach $var ( sort keys %env_vars ) { if( scalar( grep( /\b$var\b/i, @sys_env_vars ) ) < 1 ) { $var_select{ $var } = 1; } else { $var_select{ $var } = 0; } } } sub DeselectAll { foreach $var ( sort keys %env_vars ) { $var_select{ $var } = 0; } } sub SaveEnvVars { #my $filename = shift; #my $filename = "env_vars.xml"; my $output = IO::File->new( ">$filename" ); my $writer = XML::Writer->new( OUTPUT => $output, DATAMODE => 1, NEWLINES => 1 ); my( $var ); $writer->startTag( "env_def" ); foreach $var (sort keys %env_vars ) { if( $var_select{ $var } == 1 ) { $writer->dataElement( "var", "$env_vars{ $var }", "name" => $var ); } } $writer->endTag( "env_def" ); $writer->end(); $output->close(); exit; }