Как использовать Powershell Invoke-Item с поиском по gci?

#powershell

#powershell

Вопрос:

Я пытаюсь создать сценарий Powershell, который использует командлет Invoke-Item, как только я найду файлы, используя следующий сценарий:

 gci -Recurse -File *.xls* C:folder_example'  |  sort LastWriteTime | Select -last 2 | 
 

Я не уверен, как лучше всего реализовать командлет Invoke-Item отсюда?

Комментарии:

1. Вы просто добавляете его в конец, что вы имеете в виду? gci -Recurse -File .xls C:folder_example' | sort LastWriteTime | Select -last 2 | Invoke-Item

Ответ №1:

В простейшем случае Invoke-Item (псевдоним as ii ) просто нуждается в пути, заданном ему либо через конвейер, либо через параметр.

В этом случае это может быть так же просто, как добавление | Invoke-Item в конец вашей команды:

 gci -Recurse -File *.xls* C:folder_example | sort LastWriteTime | select -Last 2 | Invoke-Item
 

Одна вещь, о которой я упомяну, это то, что я обнаружил, что некоторые программы не могут обрабатывать кучу файлов, передаваемых им в быстрой последовательности, как это будет делать этот скрипт.

Обычно я сталкиваюсь с этим, когда пытаюсь открыть кучу файлов в Notepad .

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

 Get-ChildItem -Filter *.xls* | ForEach-Object { Invoke-Item $_.FullName }
 

Иногда это можно исправить, поместив вызов в ForEach-Object блок сценария. Я не уверен на 100%, почему это все исправляет, у меня есть несколько теорий, но это все, чем они являются, поэтому я не буду упоминать их в этом ответе. Но это всегда устраняет проблему для меня при использовании Invoke-Item файлов Notepad .

Некоторые программы, такие как Excel, имеют заставку при запуске и некоторую задержку перед окончательным открытием. Таким образом, вы всегда можете добавить туда сон, просто чтобы немного замедлить процесс на случай, если у вас все еще возникают проблемы:

 Get-ChildItem -Filter *.xls* | ForEach-Object { Start-Sleep 0.1; Invoke-Item $_.FullName }
 

Это добавит небольшую паузу в 100 мс только для того, чтобы дать любому приложению, которое вы запускаете, немного времени для обработки.

Комментарии:

1. Чад, это было большим подспорьем для двух других сценариев, над которыми я работал, спасибо!!!

2. @MattGilbert Потрясающе! Если вы считаете, что это ответ на ваш вопрос, пожалуйста, обязательно отметьте его как ответ 👍