Okay, Google'd and tested out a few things. It turns out I can get it to work in cmd.exe by replacing " with "^"" (all four characters). This works both from the cmd.exe shell and calling it from Perl:
#### arg_test.pl ####
my $output = `print_args.pl "Test" "Hi (12"^"" mix)" "test.txt" 2>&1`;
print "$output";
C:\scripts>print_args.pl "Test" "Hi (12"^"" mix)" "test.txt" 2>&1
Arg 0 - Test
Arg 1 - Hi (12" mix)
Arg 2 - test.txt
c:\scripts>arg_test.pl
Arg 0 - Test
Arg 1 - Hi (12" mix)
Arg 2 - test.txt
However, this isn't consistent for other external programs. I wrote a simple C program to do the same thing as print_args.pl. Replacing " with "^"" in parameters still works from the command line, but now it fails when running it from Perl.
// PrintArgs.exe
#include <stdio.h>
int main(int argc, char **argv)
{
for (int i=0; i<argc; i++)
{
fprintf(stderr, "Arg %d: %s\n", i, argv[i]);
}
return 0;
}
#### arg_test.pl ####
my $output = `PrintArgs.exe "Test" "Hi (12"^"" mix)" "test.txt" 2>&1`;
print "$output";
Here's the output I get running it directly in the shell and then from Perl:
C:\scripts\arg_problem>PrintArgs.exe "Test" "Hi (12"^"" mix)" "test.txt" 2>&1
Arg 0: PrintArgs.exe
Arg 1: Test
Arg 2: Hi (12" mix)
Arg 3: test.txt
C:\scripts\arg_problem>perl_test.pl
Arg 0: PrintArgs.exe
Arg 1: Test
Arg 2: Hi (12^
Arg 3: mix) test.txt 2>&1
This is killing me. How is the Perl-shell interaction fine in the first case but not the second? Is Perl using the exact shell on my system (c:/windows/system32/cmd.exe) or its own version? Could it be processing the parameters in some way before passing them off to the shell?
I'd really appreciate any ideas on what's going on.
|