Возникли проблемы при использовании `New-Item` в Windows 10 через Perl

Это образец текста, включая символы, которые я пытаюсь перезаписать файлом:

Home        http://domain.tld
IP|http://domain.tld/path/1
Navbar, Top|http://domain.tld/
Tips/Tricks|#some text
Accordion 2|*more text
Text|=More Text

заменяя все метасимволы, например,

s!\t!symTA!g
s!\#!symHA!g

Это мой код Perl:

`$ps New-Item $dir -Name $file -ItemType "file" -Force -Value "$out"`

Работает если $out только одна строка без пробелов!

Но это около 100 строк!

Это дает множество ошибок, подобных следующим:

Термин BlogsymPIhttpsymCOLsymFSsymFSbislinks.comsymFSblog не распознается как имя командлета, функции, файла сценария или работоспособной программы. Проверьте правильность написания имени или, если путь был указан, проверьте правильность пути и повторите попытку. В строке:2 символа:1 + BlogsymPIhttpsymCOLsymFSsymFSbislinks.comsymFSblog

Файл сохраняется, но только с первой строкой (с подстановками).

2 ответа

Обратите внимание, что максимальная длина строки командной строки составляет около 8 тыс. Символов, так что это ужасное решение общего назначения. Лучшим решением было бы записать всю команду в файл и затем вызвать ее как скрипт - я предполагаю, что по какой-то причине это невозможно - в противном случае вы, вероятно, просто использовали бы perl для записи файла - или использовали powershell для выполнения команды Работа.

Я проверял это в клубничном Perl 5.26.1.1

use MIME::Base64 ();
use Encode qw/encode decode/;
use warnings;

$ps = "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe";
$file = "c:\\strawberry\\test.txt";
$out = "Home        http://domain.tld
IP|http://domain.tld/path/1
Navbar, Top|http://domain.tld/
Tips/Tricks|#some text
Accordion 2|*more text
Text|=More Text";

$Command = "New-Item -path \"$file\" -ItemType file -Value @'\n$out\n'@";
$bytes = encode("UTF-16LE",$Command);
$encoded = MIME::Base64::encode($bytes);
$encoded =~ s/\R//g;
print "$ps -EncodedCommand $encoded";
$output = `$ps -EncodedCommand $encoded`;
print $output;

Удачи!

Почему вы используете perl вместо прямой PowerShell?

ex.txt

Home        http://domain.tld
IP|http://domain.tld/path/1
Navbar, Top|http://domain.tld/
Tips/Tricks|#some text
Accordion 2|*more text
Text|=More Text

ex.ps1

(Get-Content -Path '.\ex.txt') -replace 'regex','desired value' |
    Set-Content -Path '.\ex.txt'

Это проанализирует каждую строку в вашем документе и попытается сопоставить / заменить регулярное выражение с желаемым. Если вы не хотите загрязнять исходный файл, вы можете сделать следующее:

$Value = (Get-Content -Path '.\ex.txt') -replace 'regex','desired value'
New-Item -Path '.\pollute.txt' -Value $Value -ItemType 'File' -Force
Другие вопросы по тегам