簡體   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