Powershell excel ширина столбца
PowerShell предоставляет возможность динамического добавления новых свойств и изменения форматирования выходных данных объектов в конвейере.
Подробное описание
Несколько командлетов PowerShell преобразуют, объединяют или обрабатывают входные объекты в выходных объектах с помощью параметров, которые позволяют добавлять новые свойства в эти выходные объекты. Эти параметры можно использовать для создания новых вычисляемых свойств для выходных объектов на основе значений входных объектов. Вычисляемое свойство определяется Hashtable , содержащим пары "ключ-значение", которые указывают имя нового свойства, выражение для вычисления значения и необязательные сведения о форматировании.
Поддерживаемые командлеты
Следующие командлеты поддерживают значения вычисляемых свойств для параметра Property . Format-* Командлеты также поддерживают вычисленные значения для параметра GroupBy .
В следующем списке перечислены командлеты, которые поддерживают вычисляемые свойства и пары "ключ-значение", поддерживаемые каждым командлетом.
- name / label — необязательно (добавляется в PowerShell 6. x)
- expression
- width — необязательно
- alignment — необязательно
- name / label — необязательно
- expression
- formatstring — необязательно
Этот же набор пар "ключ-значение" также применяется к вычисляемым значениям свойств, передаваемым параметру GroupBy для всех Format-* командлетов.
- name / label — необязательно
- expression
- formatstring — необязательно
- width — необязательно
- alignment — необязательно
- expression
- formatstring — необязательно
- Поддерживает только блок скрипта для выражения, а не хэш-таблицы.
- Не поддерживается в PowerShell 5,1 и более ранних версий.
- name / label — необязательно
- expression
- expression
- ascending / descending — необязательно
Значением параметра expression может быть блок скрипта, а не хэш-таблица. Дополнительные сведения см. в разделе Примечания.
Определения ключей хэш-таблицы
Ключи Hashtable не должны быть написаны, пока указанный префикс имени не является неоднозначным. Например, n можно использовать вместо Name и e может использоваться вместо Expression .
Примеры
Compare-Object
С помощью вычисляемых свойств можно управлять способом сравнения свойств входных объектов. В этом примере вместо непосредственного сравнения значений значения сравниваются с результатом арифметической операции (модуль из 2).
ConvertTo-Html
ConvertTo-Html может преобразовать коллекцию объектов в таблицу HTML. Вычисляемые свойства позволяют управлять способом представления таблицы.
В этом примере создается таблица HTML, содержащая список псевдонимов PowerShell и числовые параметры для каждой команды с псевдонимом. Значения столбца параметеркаунт центрируются по центру.
Format-Custom
Format-Custom предоставляет пользовательское представление объекта в формате, аналогичном определению класса. Более сложные объекты могут содержать элементы, которые глубоко вложены в сложные типы. Параметр Depth параметра Format-Custom указывает глубину расширения для всех свойств. depth Ключ позволяет указать глубину расширения для каждого свойства.
В этом примере depth ключ упрощает пользовательский вывод для Get-Date командлета. Get-Date Возвращает объект DateTime . Свойство Date этого объекта также является объектом DateTime , поэтому объект является вложенным.
Format-List
В этом примере мы используем вычисляемые свойства для изменения имени и формата выходных данных из Get-ChildItem .
Format-Table
В этом примере вычисляемое свойство добавляет свойство Type , используемое для классификации файлов по типу содержимого.
Format-Wide
Format-Wide Командлет позволяет отображать значение одного свойства для объектов в коллекции в виде списка с несколькими столбцами.
В этом примере мы хотим увидеть имя файла и размер (в килобайтах) в качестве широкого списка. Поскольку Format-Wide не отображает более одного свойства, мы используем вычисляемое свойство, чтобы объединить значения двух свойств в одно значение.
Group-Object
Group-Object Командлет отображает объекты в группах на основе значения указанного свойства. В этом примере вычисляемое свойство подсчитывает количество файлов каждого типа содержимого.
Measure-Object;
Measure-Object Командлет вычисляет числовые свойства объектов. В этом примере мы используем вычисляемое свойство для получения числа (Sum) чисел от 1 до 10, которые равномерно делятся на 3.
В отличие от других командлетов, Measure-Object не принимает хэш-таблицу для вычисляемых свойств. Необходимо использовать блок сценария.
Select-Object;
Вычисляемые свойства можно использовать для добавления дополнительных элементов в выходные данные объектов с помощью Select-Object командлета. В этом примере мы перечислим псевдонимы PowerShell, которые начинаются с буквы C . Используя Select-Object , мы выводим псевдоним, командлет, с которым он сопоставлен, и количество параметров, определенных для командлета. Используя вычисляемое свойство, можно создать свойство параметеркаунт .
Sort-Object
С помощью вычисляемых свойств можно сортировать данные по разным заказам для каждого свойства. В этом примере данные из CSV-файла сортируются в порядке возрастания по дате. Но внутри каждой даты сортируются строки в убывающем порядке по унитссолд.
Примечания
Блок скрипта выражения можно указать непосредственно в качестве аргумента вместо того, чтобы указывать его в качестве Expression записи в хэш-таблице. Пример:
Этот пример удобен для командлетов, которым не требуется (или не поддерживается) именование свойства с помощью Name ключа, например Sort-Object , Group-Object и Measure-Object .
Для командлетов, которые поддерживают именование свойства, блок скрипта преобразуется в строку и используется в качестве имени свойства в выходных данных.
Expression блоки скриптов выполняются в дочерних областях, то есть переменные вызывающего объекта нельзя изменять напрямую.
Логика конвейера применяется к выходным данным из Expression блоков скриптов. Это означает, что вывод массива с одним элементом приводит к развернутому массиву.
Для большинства командлетов ошибки внутри блоков скриптов выражений не учитываются. Для Sort-Object , завершающие выполнение инструкций и ошибки, заканчивающиеся скриптом, являются выходными , но не завершают инструкцию.
PowerShell предоставляет набор командлетов, которые позволяют контролировать, какие свойства должны отображаться для определенных объектов. Имена всех этих командлетов начинаются глаголом Format . Они позволяют выбрать, какие свойства будут отображаться.
В этой статье описываются командлеты Format-Wide , Format-List и Format-Table .
У каждого типа объектов в PowerShell есть свойства по умолчанию, которые используются, если вы не настроили отображаемые свойства. Для указания свойств, которые нужно отобразить, каждый командлет использует один и тот же параметр Property. Так как Format-Wide отображает только одно свойство, в параметре Property он принимает только одно значение, тогда как Format-List и Format-Table поддерживают списки с именами свойств.
В этом примере стандартные выходные данные командлета Get-Process показывают, что работают два экземпляра Internet Explorer.
Для объектов Process по умолчанию применяется формат со следующими свойствами.
Применение командлета Format-Wide для вывода с одним элементом
По умолчанию командлет Format-Wide отображает только свойство по умолчанию для объекта. Данные, связанные с каждым объектом, отображаются в одном столбце:
Можно также задать свойство, отличное от используемого по умолчанию:
Настройка отображения командлета Format-Wide с помощью параметра Column
С помощью командлета Format-Wide одновременно можно отобразить только одно свойство. Это удобно для отображения больших списков в нескольких столбцах.
Использование командлета Format-List для представления в виде списка
Командлет Format-List показывает объект в виде списка, в котором каждое свойство снабжено меткой и отображается в отдельной строке:
Можно указать произвольное число свойств:
Получение подробных сведений с помощью подстановочных знаков в командлете Format-List
Командлет Format-List позволяет использовать подстановочные знаки в качестве значения параметра Property. Это дает возможность отображать подробные сведения. Часто объекты содержат больше информации, чем необходимо. Поэтому PowerShell по умолчанию выводит значения не всех свойств. Чтобы вывести список всех свойств объекта, используйте команду Format-List -Property * . Следующая команда формирует более 60 строк выходных данных для одного процесса:
Команда Format-List полезна для вывода подробных сведений, но для получения сведений с большим числом элементов обычно удобнее использовать упрощенное табличное представление.
Применение командлета Format-Table для табличного вывода
Если вызвать командлет Format-Table без указания имен свойств для форматирования вывода команды Get-Process , вы получите такие же выходные данные, как и без командлета Format . По умолчанию PowerShell отображает объекты Process в табличном формате.
Улучшение вывода командлета Format-Table (параметр AutoSize)
Хотя табличное представление и полезно при выводе большого количества сведений, интерпретация данных может вызвать затруднения, если экран слишком узок и не вмещает все данные. В предыдущем примере выходные данные усекаются. Если указать параметр AutoSize при выполнении команды Format-Table , PowerShell вычислит ширину столбцов на основе размера отображаемых данных. Это повышает удобство чтения столбцов.
Командлет Format-Table и в этом случае может усекать данные, но теперь только на правой границе экрана. Свойствам, за исключением последнего отображаемого, выделяется столько места, сколько нужно для корректного вывода самого длинного элемента данных.
Команда Format-Table предполагает, что свойства перечислены в порядке важности. Поэтому она пытается полностью отобразить значения свойств, которые указаны в начале списка. Если команда Format-Table не может отобразить все свойства, она удаляет из представления некоторые столбцы. Это поведение можно увидеть в предыдущем примере для свойства DependentServices.
Перенос на следующую строку вывода командлета Format-Table в столбцах (параметр Wrap)
Длинные данные командлета Format-Table можно принудительно переносить на несколько строк в пределах столбца с помощью параметра Wrap. Использование параметра Wrap не всегда приводит к ожидаемому результату, так как без параметра AutoSize он применяет параметры по умолчанию:
Использование параметра Wrap без других параметров не очень замедляет обработку. Но применение параметра AutoSize к рекурсивному выводу списка файлов в каталоге со сложной структурой может потребовать значительного времени и потреблять много памяти.
Если загрузка системы для вашего сценария не критична, параметр AutoSize хорошо сочетается с параметром Wrap. В этом случае ширина первых столбцов также позволяет выводить элементы в одной строке, а последний столбец при необходимости разбивается на несколько строк.
Возможно, некоторые столбцы не попадут в представление, если первым будет указан самый широкий столбец. Для получения лучших результатов выводите первыми элементы данных наименьшего объема.
В следующем примере первыми указаны наибольшие по размеру свойства.
Даже при использовании переноса строк столбец Id пришлось исключить:
Организация табличного вывода (параметр -GroupBy)
Другим полезным параметром управления табличным выводом является GroupBy. Длинные табличные списки особенно тяжелы для сравнения. Параметр GroupBy группирует выходные данные в соответствии со значением свойства. Например, можно сгруппировать службы по параметру StartType, чтобы упростить проверку, но исключить значение StartType из списка отображаемых свойств:
Об инвентаризации не писал, наверное, только ленивый. Вот и я, чтобы не казаться ленивым, тоже решил взяться за это дело. Поводом для написания стало появление нескольких статей на эту тему. Меня даже заинтересовала не сама инвентаризация (что там инвентаризировать – дёргай нужные объекты, смотри их свойства), а работа с Excel’ем, так как всё руки не доходили попробовать. С Word’ом сталкиваться уже приходилось, а вот с Excel’ем ещё нет. Можно, конечно, не заморачиваться, и вывести всё в CSV-файл, но повторюсь – меня интересовала именно работа с Excel: заполнение и форматирование ячеек, раскраска, диаграммы и т.д. Но обо всём по порядку 🙂
Итак, прежде всего нужно создать объект Excel и сделать его видимым, чтоб видеть всю дальнейшую магию 🙂
Это равносильно запуску Excel. Далее необходимо создать файл (в терминологии Excel рабочую книгу):
В оригинале статьи автор говорит, что этой операцией добавляется три листа, и если остальные не нужны их можно/нужно удалить, и показывает как это сделать. Но у меня добавляется только один лист, не знаю с чем это связано, возможно в разных версиях офиса по разному, поэтому я на этом останавливаться не буду.
Начинаем работать с первым листом. Для простоты обращения к нему создаём соответствующую переменную:
Далее переименовываем лист (чтобы было не Лист1, Лист2 и т.д., а “человеческие” названия) и заполняем шапку таблицы:
Как (наверное) понятно здесь мы пишем в каждую ячейку по очереди, первая цифра в скобках – номер строки, вторая – номер столбца.
Уже можно наслаждаться первыми результатами работы 🙂
Главное окно Excel
Пока смотрится криво из-за того, что надписи не влазят в ячейки, и хочется растянуть ячейки, но ничего страшного, мы это потом поправим.
Переходим на следующую строку, возвращаемся в первый столбец и в цикле заполняем таблицу данными по логическим дискам, после каждого диска переводим курсор (или как правильно назвать текущую ячейку?) на следующую строку и возвращаемся в первый столбец:
Размеры дисков переводятся в гигабайты, и чтобы много цифр не сбивали с толку, округляются до двух знаков после запятой.
Логические диски в Excel
мдя… многовато дисков, надо-бы их немножко пообъединять, создавались когда-то временно для тестовых целей, но как известно нет ничего более постоянного чем временное 🙂
Диски с нулевыми размерами это два DVD-привода и один виртуальный.
Осталось немного приукрасить внешний вид – выделим шапку таблицы (первая строка) жирным, и отрегулируем ширину ячеек по ширине текста (до этого момента я даже не подозревал, что Excel такое умеет:)):
Переменная $UsedRange содержит все занятые ячейки (эквивалентно однократному нажатию Ctrl+A)
Смотрим, что получилось:
Готовая таблица
Красота да и только 🙂
С логическими дисками разобрались, переходим к физическим.
Создадим для них отдельный лист:
Тут есть один нюанс, заключающийся в том, что листы добавляются в обратном порядке, т.е. только что добавленный лист будет иметь номер 1, а предыдущий станет номером 2. Поэтому выделяем только что созданный лист, и делаем всё то же самое, только с физическими дисками:
Смотрим, что получилось:
Логические диски
Осталось сохранить полученный отчёт и выйти из Excel:
На сегодня всё :). В следующих частях мы научимся объединять и раскрашивать ячейки, а также строить диаграммы.
Ваша оценка:
Понравилось это:
Похожее
здравствуйте, подскажите пожалуйста, как правильно вызывать метод КОПИРОВАНИЯ листа в XLS. Мой способ выдает «метод copy из класса worksheet завершен неверно»
Я использую следующий код:
$Excel = New-Object -ComObject «Excel.Application»
$Workbook = $Excel.Workbooks.open($filepath)
Вы в цикле каждый раз запускаете новый процесс Excel. Я бы так не делал, и судя по всему в этом и проблема, так как это копирование не через буфер и Ваши Excel’и просто не знают куда копировать.
Достаточно просто создать новый файл:
Я предпочитаю собирать эксель-файлы через формирование папок с xml-данными. Ком-объекты дорогие по ресурсам, кроме того, связь с ком-объектом может упасть, если данных для передачи много.
Я новичок в PS — потребовалось автоматизировать кое-что на рабочем месте (я врач).
Не могу разобраться — как обратиться из PowerShell к ячейке листа по ее имени, а не по индексной ссылке.
Есть шаблон Excel (template), на листе «Source_Data» есть именованные ячейки:
Через PS открываю новую книгу из шаблона, и вношу в данные ячейки произвольные данные:
$DocumentTemplateFile = «C:\Excel\Test_template.xltx»
$Excel = New-Object -ComObject Excel.Application
$Excel.Visible = $true
$WorkBook = $Excel.Workbooks.Open($DocumentTemplateFile)
$SrcDataWS = $WorkBook.Worksheets.Item(‘Source_Data’)
$ProtocolWS = $WorkBook.Worksheets.Item(‘Протокол’)
$SrcDataWS.Cells.Item(1,2) = 86
$SrcDataWS.Cells.Item(2,2) = 45
$SrcDataWS.Cells.Item(3,2) = 34
Проверяем, определено-ли имя ячейки — $SrcDataWS.Cells.Item(2,2).Name:
Application : System.__ComObject
Creator : 1480803660
Parent : System.__ComObject
_Default : =Source_Data!$B$2
Index : 1
Category :
CategoryLocal :
MacroType : -4142
Name : UterusHeight
RefersTo : =Source_Data!$B$2
ShortcutKey :
Value : =Source_Data!$B$2
Visible : True
NameLocal : UterusHeight
RefersToLocal : =Source_Data!$B$2
RefersToR1C1 : =Source_Data!R2C2
RefersToR1C1Local : =Source_Data!R2C2
RefersToRange : System.__ComObject
Comment :
WorkbookParameter : False
ValidWorkbookParameter : True
Как я могу обратиться из PowerShell к данной ячейки именно по ее имени «UterusHeight» без указания ее индекса как Item(2,2) ?
Это необходимо чтобы вносить данные из txt файла не по позициям, а по именам ячеек.
Перефразируя Зелёного из мультика «Тайна третьей планеты»: «Если врачи начнут программировать, то мне в IT делать нечего» 🙂
По поводу вашего вопроса попробуйте так:
$SrcDataWS.Range(‘UterusHeight’).formula = ‘Ваши данные’
>> Но у меня добавляется только один лист
File->Options->General->группа When creating new workbooks-> галка Include this many sheets — количество листов в новой книге
«Вон оно чё, Михалыч…» Спасибо, буду знать 🙂
P.S. спасибо за статью. 🙂
Підкажіть будь-ласка при копіюванні діапазону не вставляється в зазначене місце(наприкл. С1) а вставляє з початку листа(з А1)? Як заставити вставити в тому місці де потрібно?
$path = “D:\ROBOTA\PowerShell\Exp\file1.xlsx”
$Excel = New-Object -ComObject excel.application
$Excel.visible = $true
$Workbook = $excel.Workbooks.open($path)
$Worksheet = $Workbook.WorkSheets.item(1)
$worksheet.activate()
$range = $WorkSheet.Range(«A1:B1»).EntireColumn
$range.Copy() | out-null
$Worksheet = $Workbook.Worksheets.item(2)
$Range = $Worksheet.Range(«C1»)
$Worksheet.Paste()
Після того як обрали зазначене місце (у Вашом прикладі це $Range = $Worksheet.Range(«C1»)) Використовуйте метод PasteSpecial():
$Range = $Worksheet.Range(«C1»)
$Range.PasteSpecial()
Бо Ви вставляєте не в лист (не в $Worksheet), а в певне місце ($Range)
Дякую, я потім побачив свою помилку, дійсно все запрацювало, але з’явилась нова проблема з розгалуженням. Знайшов схожий скрипт але він не читає з вказаних комірок:
$num = «Бар»
$excel = New-Object -ComObject Excel.Application
Ви хоча б детальніше описали, що у файлі, що має писати 🙂
На скільки я зрозумів в залежності від значення в одному стовбці, має писатися ‘Plus’, чи ‘Minus’ у сусідньму, так?
Якщо так, то строку
if ( $EWS.Cells.Item($i, 3) -eq $num )
треба змінити на
if ( $EWS.Cells.Item($i, 3).text -eq $num )
оскільки $EWS.Cells.Item($i, 3) — це об`єкт, що містить комірку. Цей об`єкт має купу властивостей та методів. В даному випадку нас цікавить лише вміст комірки, тобто нам потрібна властивість text.
Спасибо большое за решение, мне очень пригодилось, и все понятно. Мне было важно заполнять данные по столбцам сверху в низ, а через экспорт csv не получалось.
Всем привет. Написал из разных частей скрипт на создание базы данных и передачи информации в неё из файла эксель. Может кому пригодится.
Осталось пара нюансов. Может кто подскажет как в файле Excel удалить первую строку? То есть у меня шапка файла начинается со второй строки.
$dstSrvName = «srv-sqlinf-lsn»; $dstTblName = «dbo.candi_test»
$dstCnn = New-Object Data.SqlClient.SqlConnection -ArgumentList «Server=$dstSrvName; Database=имя базы данных; Trusted_Connection=yes; MultiSubnetFailover=yes; ApplicationIntent=READWRITE;»
$dstCnn.Open()
$srcCnn = New-Object Data.OleDb.OleDbConnection -ArgumentList «Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test\test_scr_bet1.xlsx;Extended Properties=’Excel 12.0 Xml;HDR=YES'»
$srcCnn.Open()
$firstWorksheetName = «[Лист1$]»
$dstCnn1 = New-Object Data.SqlClient.SqlConnection -ArgumentList «Server=$dstSrvName; Database=имя базы данных; Trusted_Connection=yes; MultiSubnetFailover=yes; ApplicationIntent=READWRITE;»
$dstCnn1.Open()
Продолжаем работать в Excel через Powershell. Напомню, что в предыдущей части мы создали небольшую таблицу и заполнили её данными. Также напомню, что это не моё “изобретение”, а очень вольный перевод вот этих трёх статей.
Для начала подготовим плацдарм для работы: создадим объект Excel и заполним его начальными данными. Я не буду на этом останавливаться, так как это было подробно рассмотрено в прошлой статье.
На данном этапе у нас будет одна текстовая строка, размещённая в диапазоне ячеек с A1 по G2, т.е. в двух строках и семи столбцах, что по умолчанию выглядит не очень презентабельно, так как текст выравнивается по нижнему краю:
Объединённые ячейки (неформатированные)
Чтобы текст в объединённых ячейках выглядел красивее его можно выровнять по вертикали по центру.
Все варианты вертикального выравнивания можно посмотреть в MSDN. А значения, которые нужно при этом использовать можно узнать выполнив команду:
В результате мы увидим следующую таблицу:
Name | value__ |
xlVAlignTop | -4160 |
xlVAlignJustify | -4130 |
xlVAlignDistributed | -4117 |
xlVAlignCenter | -4108 |
xlVAlignBottom | -4107 |
Из таблицы видно, что для выравнивания по середине нужно использовать значение
После выравнивания наш текст будет выглядеть уже красивее:
Объединённые ячейки (отформатированные)
Переходим к заполнению таблицы данными.
Для начала переходим на следующую строку. Так как в последствии вокруг таблицы мы нарисуем рамку, нам понадобится номер начальной строки, поэтому сохраним его в отдельной переменной.
Начинаем с шапки таблицы:
Сама таблица заполняется в цикле по логическим дискам:
Фильтрация нужна для того, чтобы исключить из рассмотрения CD/DVD диски (которые чаще всего пустые, и следовательно их размер будет равен нулю).
В цикле выводим в таблицу, интересующую нас информацию:
А также раскрашиваем строки в зависимости от процента свободного места на диске. Для простоты я раскрашиваю строку, относящуюся к конкретному диску в жёлтый цвет, если свободного места на нём меньше 5 ГБ, и в красный цвет, если свободного места меньше 1 ГБ:
Смотрим, что получилось:
Результаты работы (неформатированные)
Как видно на дисках C и D свободного места меньше 5 ГБ, поэтому соответствующие строки подсвечены жёлтым цветом. А на Диске F свободного места вообще меньше 1 ГБ, поэтому он подсвечен красным цветом. Кстати, для быстрого забивания диска мне пришёл на помощь скрипт, генерирующий файл заданного размера.
В целом работа выполнена. Осталось привести таблицу к боле красивому виду. Для этого мы выровняем ширину столбцов в таблице и нарисуем рамку вокруг таблицы.
Сейчас курсор стоит уже на следующей строке, так как в цикле мы его перевели находясь ещё в цикле. А так как нам нужны только строки таблицы возвращаемся на одну строку назад и выделяем таблицу:
Напомню, что $InitialRow – это номер начальный строки таблицы, который мы заранее сохранили.
Переходим к “рисованию” рамки – границы диапазона ячеек.
Чтобы узнать все возможные варианты границ диапазона ячеек можно выполнить команду:
В результате получим таблицу:
Name | value__ |
xlDiagonalDown | 5 |
xlDiagonalUp | 6 |
xlEdgeLeft | 7 |
xlEdgeTop | 8 |
xlEdgeBottom | 9 |
xlEdgeRight | 10 |
xlInsideVertical | 11 |
xlInsideHorizontal | 12 |
Как видно из таблицы для рамки подходят значения с 7 по 12.
Подгоняем ширину столбцов:
В результате получается вот так:
Результаты работы (отформатированные)
Осталось сохранить полученный результат и выйти из Excel:
Ваша оценка:
Понравилось это:
Похожее
А не подскажешь вот такое по экселю. Сегодня бьюсь, но ни как не получается.
$file = «C:\posh\test.xls»
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$workbook = $excel.Workbooks.Open($file)
$row = 6
$column = 4
$sheet = $workbook.Worksheets.Item(1)
Затем произвожу операцию по выборке и если условие не выполняется, удаляю не нужную строку командой
$sheet.Rows.Item($row).delete()
До этого момента проблем нет, но если я хочу строку вырезать или скопировать выходит ошибка, пишет что значение NULL и все. Скопировать или вырезать не удается. Пытаюсь это сделать вот такой командой
$sheet.Rows.Item($row).copy()
И еще вопрос, вот такая связка не выдает мне результат, почему? Разве это не объект?
$sheet.Rows.Item($row) | Get- Member
переменная row содержит номер строки
frankk :
… Скопировать или вырезать не удается. Пытаюсь это сделать вот такой командой
$sheet.Rows.Item($row).copy()И еще вопрос, вот такая связка не выдает мне результат, почему? Разве это не объект?
$sheet.Rows.Item($row) | Get- Member
переменная row содержит номер строки
Затрудняюсь сказать, у меня замечательно копирует, а вторая команда выводит кучу свойств и методов.
А Excel и конкретно этот файл открыт во время выполнения проблемных команд?
Да, открыт($excel.Visible = $true), у меня стало закрадываться подозрение, что это как-то связано с тем что пока я экспериментировал с командами у меня переменные перестали освобождаться и брать новые команды, так как даже строчка с удалением перестала отрабатывать и стала выдавать кучу ошибок, перезапустил powershell и «убил» службы в диспетчере, опять стала выполняться. Буду смотреть дальше. Все равно спасибо за помощь! 🙂
Наверно уже достал 🙂 Но моя борьба с экселем продолжается :). Может ты подскажешь, своим опытным взглядом. в чем может быть причина? Имеем такой код
$file = «C:\posh\test.xls»
$col = 5000
$startTime = Get-Date -DisplayHint Time
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$workbook = $excel.Workbooks.Open($file)
$row = 6
$row1 = 2
$n = 1
$workbook.Worksheets.Add() | Out-Null
$sheet1 = $workbook.Worksheets.Item(1)
$sheet1.Name = ‘>250’
$sheet = $workbook.Worksheets.Item(2)
$sheet.Activate()
$sheet.Rows.Item(5).Copy() | Out-Null
$sheet1.Rows.Item(1).PasteSpecial() | Out-Null
While ( $n -le $col) $zna = $sheet.Cells.Item($row,20).Value()
$zna
if ($zna -lt 250) $row++
$n++
> else $sheet.Rows.Item($row).Cut() | Out-Null
$sheet1.Rows.Item($row1).PasteSpecial() | Out-Null
$sheet.Rows.Item($row).Delete() | Out-Null
$row1++
$n++
$sheet.Activate() | Out-Null
>
>
$sheet1.Activate()
Вот все что до цикла, выполняется нормально, копирует и переносит. Но как доходит до цикла, а вернее до события когда начинает отрабатывать else, получаем вот такое
«Исключение при вызове «PasteSpecial» с «0» аргументами: «Метод PasteSpecial из
класса Range завершен неверно»
строка:30 знак:4
+ $sheet1.Rows.Item($row1).PasteSpecial() | Out-Null
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ComMethodTargetInvocation»
Вот что ему может не нравится? Может у тебя есть мысли, ну или опыт. Да, команду удаление строки ввел потому что при вырезании он не удаляет эту строчку, а просто оставляет пустой.
Командлет Format-Table форматирует выходные данные команды в виде таблицы с выбранными свойствами объекта в каждом столбце. Тип объекта определяет макет по умолчанию и свойства, отображаемые в каждом столбце. Параметр Property можно использовать для выбора свойств, которые требуется отобразить.
PowerShell использует модули форматирования по умолчанию для определения отображения типов объектов. Файлы можно использовать для .ps1xml создания настраиваемых представлений, отображающих выходную таблицу с указанными свойствами. После создания настраиваемого представления используйте параметр View для отображения таблицы с пользовательским представлением. Дополнительные сведения о представлениях см. в about_Format.ps1xml.
Хэш-таблицу можно использовать для добавления вычисляемых свойств в объект перед его отображением и указания заголовков столбцов в таблице. Чтобы добавить вычисляемое свойство, используйте параметр Property или GroupBy . Дополнительные сведения о хэш-таблицах см. здесь.
Примеры
Пример 1. Форматирование узла PowerShell
В этом примере отображаются сведения о хост-программе для PowerShell в таблице.
Командлет Get-Host получает объекты System.Management.Automation.Internal.Host.InternalHost , представляющие узел. Объекты отправляются вниз по конвейеру Format-Table и отображаются в таблице. Параметр AutoSize настраивает ширину столбцов, чтобы свести к минимуму усечение.
Пример 2. Форматирование процессов по BasePriority
В этом примере процессы отображаются в группах с одинаковым свойством BasePriority .
Командлет Get-Process получает объекты, представляющие каждый процесс на компьютере, и отправляет их по конвейеру Sort-Object . Объекты сортируются в порядке их свойства BasePriority .
Отсортированные объекты отправляются по конвейеру Format-Table . Параметр GroupBy упорядочивает данные процесса в группы на основе значения свойства BasePriority . Параметр Wrap гарантирует, что данные не усечены.
Пример 3. Форматирование процессов по дате начала
В этом примере отображаются сведения о процессах, выполняемых на компьютере. Объекты сортируются и Format-Table используют представление для группировки объектов по дате начала.
Get-Process возвращает объекты System.Diagnostics.Process , представляющие процессы, выполняемые на компьютере. Объекты отправляются вниз по конвейеру Sort-Object и сортируются на основе свойства StartTime .
Отсортированные объекты отправляются по конвейеру Format-Table . Параметр View указывает представление StartTime , определенное в файле PowerShell DotNetTypes.format.ps1xml для объектов System.Diagnostics.Process . Представление StartTime преобразует время начала каждого процесса в короткую дату, а затем группирует процессы по дате начала.
Файл DotNetTypes.format.ps1xml содержит представление priority для процессов. Вы можете создавать собственные format.ps1xml файлы с настраиваемыми представлениями.
Пример 4. Использование настраиваемого представления для выходных данных таблицы
В этом примере настраиваемое представление отображает содержимое каталога. Пользовательское представление добавляет столбец CreationTime в выходные данные таблицы для объектов System.IO.DirectoryInfo и System.IO.FileInfo, созданных. Get-ChildItem
Пользовательское представление в этом примере было создано из представления, определенного в исходном коде PowerShell. Дополнительные сведения о представлениях и коде, используемом для создания представления этого примера, см. в разделе about_Format.ps1xml.
Get-ChildItem возвращает содержимое текущего каталога. C:\Test Объекты System.IO.DirectoryInfo и System.IO.FileInfo отправляются по конвейеру. Format-Table использует параметр View для указания пользовательского представления mygciview , включающего столбец CreationTime .
Выходные данные Get-ChildItem по умолчанию Format-Table не включают столбец CreationTime.
Пример 5. Использование свойств для выходных данных таблицы
В этом примере используется параметр Property для отображения всех служб компьютера в таблице с двумя столбцами, где показаны свойства Name и DependentServices.
Get-Service получает все службы на компьютере и отправляет объекты System.ServiceProcess.ServiceController вниз по конвейеру. Format-Table использует параметр Property , чтобы указать, что свойства Name и DependentServices отображаются в таблице.
Name и DependentServices — это два свойства типа объекта. Чтобы просмотреть все свойства, выполните следующие действия. Get-Service | Get-Member -MemberType Properties
Пример 6. Форматирование процесса и вычисление времени выполнения
В этом примере показана таблица с именем процесса и общим временем выполнения для процессов блокнота локального компьютера. Общее время выполнения рассчитывается для каждого процесса путем вычитания времени начала из текущего времени.
Get-Process получает все процессы блокнота локального компьютера и отправляет объекты по конвейеру. Format-Table отображает таблицу с двумя столбцами: ProcessName, Get-Process свойство и TotalRunningTime, вычисляемое свойство.
Свойство TotalRunningTime задается хэш-таблицей с двумя ключами: Label и Expression. Ключ Label указывает имя свойства. Ключ выражения указывает вычисление. Выражение получает свойство StartTime каждого объекта процесса и вычитает его из результата Get-Date команды, которая получает текущую дату и время.
Пример 7. Форматирование процессов Блокнот
В этом примере используется Get-CimInstance для получения времени выполнения для всех процессов блокнота на локальном компьютере. С параметром ComputerName можно использовать Get-CimInstance для получения сведений с удаленных компьютеров.
Get-CimInstance возвращает экземпляры класса WMI Win32_Process , описывающего все процессы локального компьютера с именем notepad.exe. Объекты процесса хранятся в переменной $Processes .
Объекты процесса в переменной $Processes отправляются вниз по конвейеру Format-Table , в который отображается свойство ProcessName и новое вычисляемое свойство Total Running Time.
Команда присваивает имя нового вычисляемого свойства Total Running Time (Total Running Time) ключу Label . Блок скрипта ключа выражения вычисляет продолжительность выполнения процесса путем вычитания даты создания процессов из текущей даты. Командлет Get-Date получает текущую дату. Дата создания вычитается из текущей даты. Результатом является значение общего времени выполнения.
Пример 8. Устранение ошибок формата
В следующих примерах показаны результаты добавления параметров DisplayError или ShowError с выражением.
Параметры
Указывает, что командлет настраивает размер и количество столбцов на основе ширины данных. По умолчанию размер и количество столбцов определяются представлением.
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Указывает, что командлет отображает ошибки в командной строке. Этот параметр можно использовать в качестве помощи для отладки при форматировании выражений в команде Format-Table и необходимости устранять неполадки с выражениями.
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Задает формат объекта коллекции и объектов в коллекции. Этот параметр предназначен для форматирования объектов, поддерживающих интерфейс ICollection (System.Collections). Значение по умолчанию — EnumOnly. Допустимые значения для этого параметра:
- EnumOnly: отображает свойства объектов в коллекции.
- CoreOnly: отображает свойства объекта коллекции.
- Оба: отображает свойства объекта коллекции и свойства объектов в коллекции.
Указывает, что командлет направляет командлет на отображение всех сведений об ошибке. Используется с параметром DisplayError или ShowError . По умолчанию при записи объекта ошибки в поток ошибок или поток отображения отображаются только некоторые сведения об ошибке.
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Задает отсортированные выходные данные в отдельных таблицах на основе значения свойства. Например, groupBy можно использовать для перечисления служб в отдельных таблицах на основе их состояния.
Введите выражение или свойство. Параметр GroupBy ожидает сортировки объектов. Перед группировкой Sort-Object Format-Table объектов используйте командлет.
Значение параметра GroupBy может быть новым вычисляемым свойством. Вычисляемое свойство может быть блоком скрипта или хэш-таблицей. Допустимые пары "ключ-значение":
- Имя (или метка) —
- Выражение — или
- FormatString —
Type: | Object |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Исключает из таблицы заголовки столбцов.
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Указывает объекты для форматирования. Введите переменную, которая содержит объекты, или команду или выражение, которое возвращает объекты.
Type: | PSObject |
Position: | Named |
Default value: | None |
Accept pipeline input: | True |
Accept wildcard characters: | False |
Задает свойства объекта, которые будут включены в вывод, и порядок их вывода. Введите одно или несколько имен свойств, разделенных запятыми, или используйте хэш-таблицу для отображения вычисляемого свойства. Разрешено использовать подстановочные знаки.
Если этот параметр опущен, свойства, отображаемые на экране, зависят от свойств первого объекта. Например, если первый объект имеет PropertyA и PropertyB , но последующие объекты имеют PropertyA, PropertyB и PropertyC, будут отображаться только заголовки PropertyA и PropertyB .
Параметр Property является необязательным. Параметры свойства и представления нельзя использовать в той же команде.
Значение параметра Property может быть новым вычисляемым свойством. Вычисляемое свойство может быть блоком скрипта или хэш-таблицей. Допустимые пары "ключ-значение":
- Имя (или метка)
- Выражение — или
- FormatString —
- Ширина — должна быть больше, чем 0
- Выравнивание — значение может быть Left , Center или Right
Type: | Object [ ] |
Position: | 0 |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | True |
Повторяет отображение заголовка таблицы после каждого полноэкранного отображения. Повторяющийся заголовок полезен, если выходные данные передаются в пейджер, less например или more разбиение на страницы с помощью средства чтения с экрана.
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Этот параметр отправляет ошибки через конвейер. Этот параметр можно использовать в качестве помощи для отладки при форматировании выражений в команде Format-Table и необходимости устранять неполадки с выражениями.
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
В PowerShell 5.1 и более ранних версиях представления по умолчанию определяются в *.format.ps1xml файлах, хранящихся в $PSHOME .
Параметр View позволяет указать альтернативный формат или пользовательское представление для таблицы. Вы можете использовать представления PowerShell по умолчанию или создавать пользовательские представления. Дополнительные сведения о создании пользовательского представления см. в разделе about_Format.ps1xml.
Альтернативные и настраиваемые представления для параметра View должны использовать формат таблицы, в противном случае произойдет Format-Table сбой. Если альтернативное представление является списком, используйте Format-List командлет. Если альтернативное представление не является списком или таблицей, используйте Format-Custom командлет.
Параметры свойства и представления нельзя использовать в той же команде.
Type: | String |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Переносит текст, не помещающийся по ширине столбца, на следующую строку. По умолчанию текст, не уместившийся по ширине столбца, усекается.
Читайте также: