package OpShellFolder; $ENV{script_name} = 'OpShellFolder.pl'; use Win32API::Registry 0.13 qw( :ALL ); my %OpSyntax = ( remark => [0,"rem"], copyfileto => [6,"copy"], copyfilefrom => [5,"copy"], copyfolderto => [6,"copy"], copyfolderfrom => [3,"copy"], delfolder => [1,"del /s /q"], delfile => [2,"del"], renamefolderto => [4,"ren"], renamefolderfrom => [3,"ren"], renamefileto => [6,"ren"], renamefilefrom => [5,"ren"], movefolderto => [4,"move"], movefolderfrom => [3,"move"], movefileto => [6,"move"], movefilefrom => [5,"move"] ); my %ShellFolderKeys = map({$_ => 1} (qw(AppData Cache Cookies Desktop Favorites History Personal Programs Startup Templates), "My Pictures", "Start Menu") ); sub OpShellFolder { my ($op, $shellfolderkey, $something) = @_; my ($type, $shellfolder, $opcmd, @Syntax, $key, $wkey); $op = lc$op; if (!exists $OpSyntax{$op}) { print "Error - $op is not an invalid operation\n"; return; } if (!exists $ShellFolderKeys{$shellfolderkey}) { print "Error - $shellfolderkey is not an invalid shell folder key\n"; return; } $something=~/([^\\]+)$/; ($something_filepath, $something_filename)=($`, $1); # Retrive the registry keys RegOpenKeyEx( HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders", 0, KEY_READ, $wkey ) or die "Can't open HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders: $^E\n"; RegQueryValueEx( $wkey, $shellfolderkey, [], $type, $shellfolder, [] ) or die "Can't read HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders: $^E\n"; RegCloseKey( $wkey ); $opcmd = $OpSyntax{$op}[1]; @Syntax = ( "$opcmd $something", #0 "$opcmd \"$shellfolder\"", #1 "$opcmd \"$shellfolder\"\\\"$something\"", #2 "$opcmd \"$shellfolder\" \"$something\"", #3 "$opcmd \"$something\" \"$shellfolder\"", #4 "$opcmd \"$shellfolder\"\\\"$something_filename\" \"$something\"", #5 "$opcmd \"$something\" \"$shellfolder\"\\\"$something_filename\"", #6 ); system($Syntax[$OpSyntax{$op}[0]]); } # Cmd entry point for script. if (eval("\$0 =~ /" . __PACKAGE__ . "\\.pl\$/i")) { &OpShellFolder(@ARGV); } 1;