Трубопровод и Powershell - PullRequest
       23

Трубопровод и Powershell

0 голосов
/ 12 марта 2020

Я пытаюсь прочитать один файл, сохранить его в переменной и заменить текст в файле 2 данными из файла 1. Однако мой вывод не выглядит точным. Вот мой источник:

$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 и заменяю все экземпляры 'var' в моем файле unt.txt, но в настоящее время он повторяет первое место в массиве, 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'

et c ...

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Я не могу понять, что вы пытаетесь заменить чем-либо. Можете ли вы привести примеры ваших двух входных файлов и ожидаемого выходного файла?

Далее: Часть вашей проблемы может быть "-Raw":

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

При использовании -raw $ orders будет содержать одну (1) строку. Итак, ваш «foreach» -L oop будет запущен ровно один раз со всем содержимым test2.txt в $ file. Без -raw $ orders будет содержать массив строк. Итак, ваш «foreach» -L oop будет запускаться один раз за строку в test2.txt (и всегда иметь эту строку в $ file)

Последнее, но не менее важное: наименование вводит в заблуждение. У вас есть переменная $ files и переменная с именем $ file, и у вас есть foreach-l oop. Обычно вы ожидаете, что $ file будет одним из $ files в al oop => Я бы порекомендовал вам сменить имена на «foreach ($ order in $ orders)», чем это станет понятнее.

Рейгардс

Филипп

0 голосов
/ 12 марта 2020

Я делаю немного прыжок здесь, но я думаю, что приведенный ниже пример будет делать примерно то, что вы хотите в консоли:

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

Чтобы превратить это обратно во что-то, что выполняет файловый ввод-вывод, вы можете сделать это вместо этого:

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

...