通过Perl在Windows 10上使用“New-Item”时遇到问题

时间:2017-11-09 17:46:17

标签: perl powershell windows-10 new-item

这是一个包含符号的文本示例,我试图用以下内容覆盖文件:

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

文件已保存但只有第一行(带替换)。

2 个答案:

答案 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