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