JustinB123
JustinB123

Reputation: 31

Pipeline and Powershell

I am attempting to read one file, store it in a variable and replace text in file 2 with the data from file 1. However, my output does not seem accurate. Here is my source:

$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
}

When I use "$_", the 'var' is replaced, but there seems to be no data. I've also used $orders, but I can't seem to increment the data on the string. The file I'm attempting to edit is as shows My unt.txt file is as follows and all instances of 'var' would need to be replaced but iteratively from the array, so the first var would be replaced by $orders[0], the second by $orders[1], but I am having difficulty.:

autECLSession.autECLPS.SendKeys "var"

autECLSession.autECLOIA.WaitForInputReady
autECLSession.autECLPS.SendKeys "[enter]"

autECLSession.autECLPS.SendKeys "var"

However, when the file runs it shows as:

autECLSession.autECLPS.SendKeys ""

autECLSession.autECLOIA.WaitForInputReady
autECLSession.autECLPS.SendKeys "[enter]"

autECLSession.autECLPS.SendKeys ""

Furthermore, when I try to use the variable, $orders, I can't seem to figure out how to track the data being sent, an example of the output looks like it is just pasting the entire variable. I attempted to use Split, but I run into the same problem:

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

Apologies for not including the text, but here are my files. I am attempting to take the input from test2 and replacing all instances of 'var' in my unt.txt, but currently it is repeating the first spot in the array, H00697581. My test2 file:

H00697581
H00699775
M00690370
A00694622
D00690481
U00695159
H00699618

The test.3.txt is just the output, but I expect it to look like so:

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'

etc...

Upvotes: 0

Views: 110

Answers (2)

mclayton
mclayton

Reputation: 9975

I'm making a bit of a leap here, but I think the example below will do roughly what you want in a console:

$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);

which outputs:

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]"

To turn that back into something that does file-based IO, you can do this instead:

$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;

where "commands.txt" is:

autECLSession.autECLPS.SendKeys "{0}"
autECLSession.autECLOIA.WaitForInputReady
autECLSession.autECLPS.SendKeys "[enter]"

Upvotes: 0

FGeyer
FGeyer

Reputation: 41

I can't realy get, what you're trying to replace with what. Can you give an examples of your two Input-Files and expected Output-File?

Next: Part of your Issue might be the "-Raw":

$orders = Get-Content -path F:\test2.txt -Raw
foreach($file in $orders) { ... }

When using -raw, $orders will contain one (1) string. So, your "foreach"-Loop will exactly run once, with the whole contents of test2.txt in $file. Without -raw, $orders will contain an Array of strings. So, your "foreach"-Loop will run one time per line in test2.txt (and always have this line in $file)

Last but not least: The naming is misleading. You have a variable $files and one which is named $file, and you have a foreach-loop. Usually, you'd expect to be $file one of the $files in a loop => I'd recommend you to change names to "foreach ($order in $orders)", than it gets clearer what is meant.

Reagards

Filipp

Upvotes: 1

Related Questions