繁体   English   中英

管道和 Powershell

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM