Возникли проблемы при использовании `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