note
Util
<p>
First, basic debugging:
Extract that long command string to a separate var, and print it.
<code>
my $cmdline =
'C:\windows\system32\WindowsPowerShell\v1.0\powershell.exe -command "& D:\scripts\get-info.ps1 "."\'$val1\' "."\'$filename\'"';
print $cmdline, "\n";
Win32::Process::Create(
$process,
$^X,
$cmdline,
0,
DETACHED_PROCESS,
".",
);
</code>
You will see that you are not passing the string that you think. When you put a $var in single quotes, it does not get replaced with the value of $var (interpolation). Double-quoted strings *do* interpolate.
</p>
<p>
Second, (as [id://961] pointed out), <code>$^X</code> is the wrong thing to pass as second parameter; it would run another copy of Perl, instead of PowerShell. Read the docs, not just example code. The [mod://Win32::Process] docs say that it is the "full path of the executable module", so in your case, it is probably the full path to PowerShell.
</p>
<p>
When quoting is complex, it helps to build the string in stages, and sometimes to use <code>q{...}</code> and <code>qq{...}</code> in place of <code>'...'</code> and <code>"..."</code>.
</p>
<p>
Use <code>0</code> instead of <code>DETACHED_PROCESS</code> until everything else is working right, so you can better see the errors from PowerShell.
</p>
<p>
The code below is untested for PowerShell, since I lack it on my Win2k box. I don't know exactly what kind of quoting it expects, or what that <code>&</code> does, but this should get you farther down the path:
<code>
use strict;
use warnings;
use Win32::Process;
my $val1 = 'dummy1';
my $filename = 'dummy2';
my $q_val1 = "'" . $val1 . "'";
my $q_filename = "'" . $filename . "'";
my $appname =
'C:\windows\system32\WindowsPowerShell\v1.0\powershell.exe';
my $ps_command = join ' ', (
'&', 'D:\scripts\get-info.ps1', $q_val1, $q_filename,
)
my $cmdline = qq{$appname -command "$ps_command"};
print $cmdline, "\n";
my $process;
my $rc = Win32::Process::Create(
$process,
$appname,
$cmdline,
0,
0, # replace with DETACHED_PROCESS later
".",
);
if ( $rc == 0 ) {
print Win32::FormatMessage( Win32::GetLastError() );
}
else {
print "Success!\n";
}
</code>
</p>
938872
938872