По сути, я написал Perl-скрипт, который создает закодированную команду для Powershell и пытается ее запустить.Мне пришлось явно преобразовать командную строку в utf-16 перед ее кодировкой base64.Мне интересно, почему это все Мне нужно было заставить скрипт работать.Какие преобразования выполняет Perl в Windows * по умолчанию при запуске «обычной» программы, которая взаимодействует с консолью и, возможно, с файловой системой?Например, конвертируется ли argv?Преобразован ли stdin / stdout?Проходит ли файловый ввод-вывод преобразование?
, в частности, дистрибутив Strawberry Perl в случае, если ActivePerl делает что-то другое
Я пытаюсь написать сценарий Perl, который вызывает много PowerShellфрагментируется и зависит от дистрибутива Strawberry Perl.
PowerShell, довольно удобно, имеет флаг -encodedCommand
, который принимает строку в кодировке base64, а затем обрабатывает ее.Это полезно для избежания проблем, связанных с цитированием.
Я попробовал самое простое, что могло бы сработать.
// powersheller.pl
#! /usr/bin/env perl
use strict;
use warnings;
use MIME::Base64;
use Encode qw/encode decode/;
use vars ('$powershell_command');
sub run_powershell_fragment {
my ($contents) = @_;
my $encoded = encode_base64($contents);
printf "encoded: %s\n", $encoded;
return `powershell.exe -noprofile -encodedCommand $encoded`;
}
printf "%s\n---\n", run_powershell_fragment($powershell_command);
BEGIN {
$powershell_command = <<EOF
echo "hi"
EOF
}
И запустил его.Вот вывод ... стандартных выходных каналов (?) При запуске сценария perl в окне powershell.
PS C\...> perl .\powersheller.pl
encoded: ZWNobyAiaGkiCQo=
Redundant argument in printf at .\powersheller.pl line 18.
?????? : The term '??????' is not recognized as the name of a cmdlet, function, script file, or operable program.
---
Это выглядело как проблема с кодировкой.Я догадывался, что Perl использует что-то похожее на utf-8 по умолчанию, и powershell ожидал utf16-le или аналогичный.
sub run_powershell_fragment {
my ($contents) = @_;
my $utf16_le_contents = encode("utf-16le", $contents);
my $encoded = encode_base64($utf16_le_contents);
printf "encoded: %s\n", $encoded;
return `powershell.exe -noprofile -encodedCommand $encoded`;
}
Технически, использование "ucs-2le"
также работает.Я не знаю, что подходит.
В любом случае, все вместе, программа работает, как и ожидалось, со вставленным дополнительным преобразованием.
PS C:\...> perl .\powersheller.pl
encoded: ZQBjAGgAbwAgACIAaABpACIACQAKAA==
hi
---
Почему это было все, что мне нужно было сделать?Связывает ли Perl конвертации с argv и stdout & c?