findphysicaldrive.pl - Fixed so it works with empty (freshly formatted) drives.
#!/usr/bin/perl
# Copyright (c) 2009 Symbian Foundation Ltd
# This component and the accompanying materials are made available
# under the terms of the License "Eclipse Public License v1.0"
# which accompanies this distribution, and is available
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
#
# Initial Contributors:
# Symbian Foundation Ltd - initial contribution.
# Mike Kinghan, mikek@symbian.org
#
# Contributors:
#
# Description:
# This is a tool for sending an ATS3 testdrop to an ATS3 server.
use strict;
use Getopt::Long;
use File::Spec;
my $link;
my $target;
my $help;
my $force = 0;
sub usage($);
sub help();
sub usage_error();
my %optmap = ( 'link' => \$link,
'target' => \$target,
'force' => \$force,
'help' => \$help);
GetOptions(\%optmap,
'link=s',
'target=s',
'force!',
'help!')
or usage_error();
if ($help) {
help();
}
usage_error(), unless (defined($link) && defined($target));
my $junction_help = `junction /accepteula /?`;
die("Need command \"junction\". Not found\n"), if ($junction_help =~ /is not recognised/);
die("Directory \"$target\" not found\n"), unless -d "$target";
my ($vol,$dir,$file) = File::Spec->splitpath($target);
my @subst_lines = `subst`;
foreach (@subst_lines) {
my $line = $_;
chomp($line);
$line =~ /^(.:)\\: => (.*)$/;
die("Cannot parse output of 'subst'. Bailing out confused."), unless (defined($1) and defined($2));
my $subst_drive = $1;
my $subst_targ = $2;
if (lc($subst_drive) eq lc($vol)) {
print("Target $target is in a substituted drive: $line\n");
$target = File::Spec->catfile(($subst_targ,$dir),$file);
print("Target $target will be used\n");
last;
}
}
if ( -e "$link") {
print("\"$link\" already exists. ");
if (!$force) {
my $choice;
while($choice ne 'y' and $choice ne 'n') {
print "Delete? (y/n)? ";
$choice = <STDIN>;
chomp($choice);
$choice = lc($choice);
}
$force = $choice eq 'y';
}
if ($force) {
system("junction /accepteula -d \"$link\" > nul");
if ($?) {
die("Cannot delete \"$link\": $!\n");
}
else {
print "Deleted \"$link\"\n";
}
}
}
system("junction /accepteula \"$link\" \"$target\" > nul");
if ($?) {
die("Cannot cteate junction \"$link\" -> \"$target\": $!\n");
}
else {
print("Created junction \"$link\" -> \"$target\"\n");
}
exit 0;
sub usage($)
{
my $error = shift;
my $fh = $error == 0 ? *STDOUT : *STDERR;
print $fh "make_junction.pl\n" .
"Create a Windows junction (a.k.a symbolic link)\n" .
"usage:\n" .
" make_junction.pl --help\n" .
" make_junction.pl --link=LINKDIR --target=TARGDIR\n " .
"options:\n" .
" --help Display this help and exit\n" .
" --link=LINKDIR LINKDIR specifies the junction to be created. Last component is the junction. The rest must exist\n" .
" If LINKDIR is an existing junction it is pre-emptively deleted\n" .
" --target=TARGDIR TARGDIR is directory to which the junction will point.\n" .
" If TARGDIR is in a substed drive, the real path will be used.\n";
exit $error;
}
sub help()
{
usage(0);
}
sub usage_error()
{
usage(1);
}
# EOF