Передача agruments в другую программу в Powershell - PullRequest
0 голосов
/ 31 декабря 2011

Я пытаюсь написать скрипт, который будет анализировать каталог, находить 3 новейших файла с заданным расширением среди других файлов с таким же именем, но с другим расширением, а затем передавать результат в программу командной строки.

Пока у меня есть:

$file = dir test -Exclude *.md5 | sort -prop LastWriteTime | select fullname -last 3
\path\program argumentA $file[0] argumentB "argumentC"
\path\program argumentA $file[1] argumentB "argumentC"
\path\program argumentA $file[2] argumentB "argumentC"

Не уверен, что это имеет большое значение, но аргумент2 должен быть в кавычках, чтобы программа могла его использовать. В конечном итоге я либо получу вывод в файл, либо, предпочтительно, использую вывод в другой строке кода, описанной в бонусном вопросе.

Проблема, с которой я столкнулся, заключается в том, что когда я использую $ file [0] в качестве аргумента, ничего не происходит. Когда я использую имя файла, хранящееся в $ file [0], вместо использования переменной, он запускается, но не передает аргумент B или аргументC. Если я запускаю его из cmd, я получаю правильный вывод.

Мои вопросы: Как заставить программу распознавать переменную? Как заставить программу распознавать другие аргументы?

Бонусный вопрос: Программа выведет список файлов. Как мне удалить все в данной папке, кроме файлов, перечисленных в выходных данных программы?

Ответы [ 3 ]

0 голосов
/ 31 декабря 2011

Поскольку вы передаете по трубопроводу Select-Object и выбираете свойство FullName, у вас есть 3 объекта типа System.Management.Automation.PSCustomObject со свойством FullName.Вы должны получить доступ к свойству FullName объекта, когда будете использовать его в качестве аргумента командной строки для вашей программы, например:

$file = dir test -Exclude *.md5 | sort -prop LastWriteTime | select fullname -last 3
\path\program argumentA $file[0].FullName argumentB "argumentC"

Если вы удалите свойство fullname из командлета Select-Object, Powershell не создастa PSCustomObject, и вы можете получить доступ ко всем свойствам и методам из исходного System.IO.FileInfo объекта.

Вот как вы можете увидеть разницу:

PsCustomObject

$file = dir test -Exclude *.md5 | sort -prop LastWriteTime | select fullname -last 3
$file[0] | gm

System.IO.FileInfo

$file = dir test -Exclude *.md5 | sort -prop LastWriteTime | select -last 3
$file[0] | gm
0 голосов
/ 07 января 2012

Я бы на самом деле использовал цикл с этим, чтобы избежать дублирования.(Таким образом вы избежите ошибок копирования и вставки и упростите проблему, особенно если вы добавите обработку ошибок или что-нибудь еще позже).

$files = dir test -Exclude *.md5 | sort -prop LastWriteTime | 
  select fullname -last 3

foreach ($file in $files) { 
  & \path\program argumentA $file argumentB "argumentC"
}

Поскольку PS все равно обрабатывает коллекции так же, как обычные объекты, это работает, даже если вы выберете только 1 объект.

0 голосов
/ 31 декабря 2011

Попробуйте

$($file[0])

Я считаю, что мне часто приходится заключать вещи в "волшебные" скобки со знаком доллара, чтобы заставить их работать в PowerShell.

...