2011-12-30 3 views
0

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

До сих пор у меня есть:

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

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

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

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

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

+0

Я не понимаю, что вы имеете в виду, «чтобы пройти только одну строку за раз». Вы вызываете программу три раза с 4 аргументами за вызов. Можете ли вы уточнить, что вы хотите сделать? –

+0

Что вы получаете, когда получаете доступ к $ file [0] .FullName'? –

+0

'$ file [0] .fullname' и' $ file [0] 'одинаковы:' C: \ file.txt' – Philosophene

ответ

0

Попробуйте

$($file[0]) 

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

+0

Ничего волшебного здесь. Здесь вы [subexpression] (http://ss64.com/ps/syntax-operators.html), который в этом случае возвращает тот же самый объект 'System.IO.FileInfo'. –

+0

Небольшая коррекция, на самом деле она возвращает 'PSCustomObject'. Когда я впервые прочитал код arcesso, я упустил конец первой строки. Однако результат подвыражения тот же, он возвращает тот же объект. –

+1

Да, я процитировал «волшебный» по какой-то причине. Это было не значит, что они были - на самом деле - волшебством, а скорее предполагали, что они - хороший способ исправить такие вещи, которые, похоже, очень много. –

0

С вашего трубопровода до 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 не будет создавать 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

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

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

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

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