Повторите часть команды несколько раз в PowerShell - PullRequest
3 голосов
/ 08 апреля 2020

У меня есть команда, которую я сохранил в переменной $command, что-то вроде этого
$command = path\to\.exe
. $command имеет параметр -f, который представляет путь к файлу. Этот параметр может повторяться несколько раз в одной строке, чтобы выполнить команду для нескольких файлов без необходимости перезагружать необходимые модели каждый раз, когда команда выполняется для каждого файла.

Пример:
Если у меня есть 3 файла, мне нужно запустить команду, тогда я могу выполнить ее так:

& $command -f 'file1' -f 'file2' -f 'file3' -other_params

Я хочу знать, есть ли способ сделать это в PowerShell, если у меня есть 100 файлов, поскольку я, очевидно, не могу попытаться передать 100 параметров вручную.

Ответы [ 3 ]

4 голосов
/ 08 апреля 2020

A Решение PowerShell v4 + с использованием метода массива .ForEach() :

# Open-ended array of input file names.
$files = 'file1', 'file2', 'file3'

& $command $files.ForEach({ '-f', $_ }) -other_params

In PowerShell v3- , используйте затем, через командлет ForEach-Object (что немного менее эффективно):

# Open-ended array of input file names.
$files = 'file1', 'file2', 'file3'

& $command ($files | ForEach-Object { '-f', $_ }) -other_params

Оба решения:

  • конструкция плоский массив строк , который с вводом образца совпадает с
    '-f', 'file1', '-f', 'file2', '-f', 'file3'

  • , полагается на то, что PowerShell передает элементы массива в виде отдельных аргументов при вызове внешней программы (например, *.exe файл).

2 голосов
/ 08 апреля 2020

Если я понимаю ваш вопрос, вот один из способов:

$fileList = @(
  "File 1"
  "File 2"
  "File 3"
  "File 4"
)
$argList = New-Object Collections.Generic.List[String]
$fileList | ForEach-Object {
  $argList.Add("-f")
  $argList.Add($_)
}
$OFS = " "
& $command $argList -other_params

Параметры командной строки, переданные $command, в этом примере будут:

-f "File 1" -f "File 2" -f "File 3" -f "File 4" -other_params
1 голос
/ 08 апреля 2020

Я не совсем уверен, как вы строите свой список файлов. Я сделал это с get-childitem, надеясь, что это будет подходящей заменой для того, что вы делаете. Я сделал здесь функцию с именем Command-Multiparam, которая может принимать массив в качестве параметра. Затем мы используем foreach() l oop для каждого файла в массиве.

# Set your $command variable
$command = "path\to\.exe"

# First build a list of files to run the command on.
$files_list = gci "\\server\folder123\*" -include "*.txt"

function Command-Multiparam{
    param(
        [Parameter(Position = 0)]
        [string[]]$files_list
        )

    foreach ($file in $files_list){ 
        & $command -f $file
    }
}

Использование: Command-Multiparam $files_list

Или, если вы не строили свой список с get-childitem Command-Multiparam 'file1.txt' 'file2.txt' file3.txt' 'file4.txt'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...