这是一个包含符号的文本示例,我试图用以下内容覆盖文件:
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不被识别为cmdlet,函数,脚本文件或可操作程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。在行:2 char:1 + BlogsymPIhttpsymCOLsymFSsymFSbislinks.comsymFSblog
文件已保存但只有第一行(带替换)。
答案 0 :(得分:0)
请注意,命令行字符串的最大长度约为8k个字符,因此这是一个糟糕的通用解决方案。一个更好的解决方案是将整个命令写入文件,然后将其作为脚本调用 - 我会假设这是不可能的 - 否则您可能只是使用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;
祝你好运!
答案 1 :(得分:-1)
为什么使用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