[英]Pipeline and Powershell
我试图读取一个文件,将它存储在一个变量中,然后用文件 1 中的数据替换文件 2 中的文本。但是,我的输出似乎不准确。 这是我的来源:
$orders = Get-Content -path F:\test2.txt -Raw
$files = Get-Content -path F:\unt.txt -Raw
foreach($file in $orders)
{
$files.replace("var",$_) | Set-Content -path .\test3.txt
}
当我使用“$_”时,“var”被替换,但似乎没有数据。 我也使用过 $orders,但我似乎无法增加字符串上的数据。 我试图编辑的文件如下所示 我的 unt.txt 文件如下,所有 'var' 实例都需要替换,但从数组中迭代,所以第一个 var 将被替换为 $orders[0] ,第二个是 $orders[1],但我遇到了困难。:
autECLSession.autECLPS.SendKeys "var"
autECLSession.autECLOIA.WaitForInputReady
autECLSession.autECLPS.SendKeys "[enter]"
autECLSession.autECLPS.SendKeys "var"
但是,当文件运行时,它显示为:
autECLSession.autECLPS.SendKeys ""
autECLSession.autECLOIA.WaitForInputReady
autECLSession.autECLPS.SendKeys "[enter]"
autECLSession.autECLPS.SendKeys ""
此外,当我尝试使用变量 $orders 时,我似乎无法弄清楚如何跟踪正在发送的数据,输出示例看起来只是粘贴了整个变量。 我尝试使用 Split,但遇到了同样的问题:
autECLSession.autECLPS.SendKeys'H00697581'
H00699775
M00690370
A00694622
D00690481
U00695159
H00699618
autECLSession.autECLOIA.WaitForInputReady
autECLSession.autECLPS.SendKeys "[enter]"
autECLSession.autECLPS.SendKeys'H00697581'
H00699775
M00690370
A00694622
D00690481
U00695159
H00699618
抱歉没有包含文本,但这是我的文件。 我正在尝试从 test2 获取输入并替换 unt.txt 中的所有 'var' 实例,但目前它正在重复数组中的第一个位置 H00697581。 我的 test2 文件:
H00697581
H00699775
M00690370
A00694622
D00690481
U00695159
H00699618
test.3.txt 只是输出,但我希望它看起来像这样:
autECLSession.autECLPS.SendKeys'H00697581'
autECLSession.autECLOIA.WaitForInputReady
autECLSession.autECLPS.SendKeys "[enter]"
autECLSession.autECLPS.SendKeys'H00699775'
autECLSession.autECLOIA.WaitForInputReady
autECLSession.autECLPS.SendKeys "[enter]"
autECLSession.autECLPS.SendKeys'M00690370'
等等...
我真的不明白,你想用什么来代替什么。 你能举例说明你的两个输入文件和预期的输出文件吗?
下一页:您的部分问题可能是“-Raw”:
$orders = Get-Content -path F:\test2.txt -Raw
foreach($file in $orders) { ... }
使用 -raw 时,$orders 将包含一 (1) 个字符串。 因此,您的“foreach”-Loop 将只运行一次,并在 $file 中包含 test2.txt 的全部内容。 如果没有 -raw,$orders 将包含一个字符串数组。 因此,您的“foreach”-Loop 将在 test2.txt 中每行运行一次(并且始终在 $file 中包含这一行)
最后但并非最不重要的一点:命名具有误导性。 您有一个变量 $files 和一个名为 $file 的变量,并且您有一个 foreach 循环。 通常,您希望 $file 成为循环中的 $files 之一 => 我建议您将名称更改为“foreach ($order in $orders)”,这样它的含义就更清楚了。
问候
菲利普
我在这里进行了一些飞跃,但我认为下面的示例将在控制台中大致完成您想要的操作:
$commands = @(
"autECLSession.autECLPS.SendKeys `"{0}`"",
"autECLSession.autECLOIA.WaitForInputReady",
"autECLSession.autECLPS.SendKeys `"[enter]`"",
""
);
$files = @(
"H00697581",
"H00699775",
"M00690370"
);
$script = @();
foreach( $file in $files )
{
foreach( $command in $commands )
{
$script += $command -f $file;
}
}
write-host ($script | fl * | out-string);
输出:
autECLSession.autECLPS.SendKeys "H00697581"
autECLSession.autECLOIA.WaitForInputReady
autECLSession.autECLPS.SendKeys "[enter]"
autECLSession.autECLPS.SendKeys "H00699775"
autECLSession.autECLOIA.WaitForInputReady
autECLSession.autECLPS.SendKeys "[enter]"
autECLSession.autECLPS.SendKeys "M00690370"
autECLSession.autECLOIA.WaitForInputReady
autECLSession.autECLPS.SendKeys "[enter]"
要将其转回执行基于文件的 IO 的操作,您可以改为执行以下操作:
$commands = Get-Content -Path "commands.txt";
$files = Get-Content -Path "files.txt";
$script = @();
foreach( $file in $files )
{
foreach( $command in $commands )
{
$script += $command -f $file;
}
}
Set-Content -Path "script.txt" -Value $script;
其中“commands.txt”是:
autECLSession.autECLPS.SendKeys "{0}"
autECLSession.autECLOIA.WaitForInputReady
autECLSession.autECLPS.SendKeys "[enter]"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.