Создание/заполнение файла csv с помощью Powershell. Powershell создание файла


Создание файла произвольного размера в Windows

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

Создание файла с помощью fsutil

Быстрее и проще всего создать файл с помощью утилиты командной строки fsutil. Для примера откроем консоль (обязательно с правами администратора) и создадим на диске E файл file.txt размером 1ГБ командой:

fsutil file createnew E:\File.txt 1000000000

Таким образом можно создать файл любого размера, причем файл создается практически мгновенно.

Создание файла с помощью PowerShell

То же самое можно сделать с помощью PowerShell, хотя команды будут немного сложнее:

$file = New-Object -TypeName System.IO.FileStream -ArgumentList E:\File.txt,Create,ReadWrite$file.SetLength(1000Mb)$file.Close()

Здесь мы сначала создаем объект типа файл, а затем с помощью метода SetLength присваиваем ему необходимый размер. Таким способом также можно мгновенно создать файл любого размера.

 

Есть и еще один, альтернативный способ создания файла с помощью PowerShell. Если в первом случае мы создавали файл и задавали его размер, то здесь создаем содержимое нужного размера и помещаем это содержимое в указанный файл. Например:

$content = New-Object -TypeName Byte[] -ArgumentList 10MbSet-Content -Path E:\File.txt -Value $content -Encoding Byte

 

При использовании этого метода создание файла занимает некоторое время, зависящее от размера файла. Кроме того, с его помощью невозможно создать файл большого размера. Максимальный размер файла ограничен встроенным значением [int]::MaxValue и при его превышении будет выдана ошибка ″Array dimentions exceeded supported range″.

 

Все описанные  способы создают пустые файлы (точнее файлы, заполненные символом NUL). Если надо создать файл заданного размера и заполнить его каким либо произвольным содержимым, то можно немного изменить предыдущий способ и воспользоваться такими командами:

$array = New-Object -TypeName Byte[] -ArgumentList 10Mb$obj = New-Object -TypeName System.Random$obj.NextBytes($array)Set-Content -Path E:\File.txt -Value $array -Encoding Byte

 

Ну и для генерации большого количества файлов (напр. 1000) можно воспользоваться таким скриптом:

$array = New-Object -TypeName Byte[] -ArgumentList 10Mb$obj = New-Object -TypeName System.Random$obj.NextBytes($array)for ($i=1; $i -le 1000; $i++) {Set-Content -Path E:\File.txt$i -Value $array -Encoding Byte}

Работает небыстро, но для ускорения можно запустить скрипт в несколько потоков.

windowsnotes.ru

Создание временного файла в PowerShell

Создание временного файла в PowerShell

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

Первый способ предполагает прямое использование .NET, для создания файла используется метод GetTempFileName класса System.IO.Path. Для примера создадим временный файл такой командой:

$file = [System.IO.Path]::GetTempFileName()

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

Get-Process | where {$_.CPU -ge 1} | Out-File $file

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

Remove-Item $file

 

Этот способ универсален и работает на всех версиях PowerShell, хотя и несколько сложен. Видимо поэтому в PowerShell 5.0 появился специальный командлет New-TemporaryFile, с помощью которого можно создать временный файл. Обращаться к созданному файлу нужно по свойству FullName. Cоздание файла с использованием данного командлета будет выглядеть так:

$file = New-TemporaryFile

Так добавление данных:

Get-Process | where {$_.CPU -ge 1} | Out-File $file.FullName

и удаление:

Remove-Item $file.FullName

windowsnotes.ru

powershell - Создание/заполнение файла csv с помощью Powershell

Чтобы дополнить Мартин Брандл полезным ответом с объяснением ваших симптомов (выделено мной):

Я попытался снова использовать $output += $row чтобы добавить больше строк, но он вообще не работает и вызывает некоторые странные ошибки (если я пишу в строку, он записывает все строки, возможно, потому что это все тот же объект).

В самом деле, это то, что произошло: в терминах.NET тип (класс) [pscustomobject] является ссылочным типом, а не типом значения, о чем свидетельствует [pscustomobject].IsValueType возвращает $false.

Если вы добавляете заданный экземпляр (объект) ссылочного типа в массив несколько раз, все такие элементы указывают на тот же самый экземпляр.

Вот краткая демонстрация.

$obj = [PSCustomObject] @{ 'Example Header 1' = $null 'Example Header 2' = $null } $array = @() foreach ($ndx in 1..2) { # By working with the original $obj every time, you # keep modifying its property values. $obj.'Example Header 1' = $ndx # Adding $obj to an array does NOT create a COPY of $obj # but stores a REFERENCE directly to $obj in the array # (similar to storing a pointer in unmanaged languages such as C++). $array += $obj } # Print the array. $array

Это дает следующее:

Example Header 1 Example Header 2 ---------------- ---------------- 2 2

Как вы можете видеть, только последнее значение, присвоенное .Example Header 1 вступило в силу, поскольку оба элемента массива ссылаются на тот же самый объект.

Решение на основе классов

Мартин - самый простой способ решить эту проблему: создать новый экземпляр настраиваемого объекта на каждой итерации (через синтаксис hashtable-literal, как теперь показано в самом вопросе: $array += [pscustomobject] @{... }).

Если вы не хотите или не можете воссоздать свои экземпляры с нуля внутри цикла, у вас есть два основных варианта:

  • Однако клонировать объект шаблона в каждой итерации цикла:

    • [pscustomobject] не поддерживает клонирование (не реализует [System.ICloneable]),
    • и в то время как [hashtable] делает вариант с упорядоченными ключами, доступный в PSv3+ ([ordered] @{... }, [System.Collections.Specialized.OrderedDictionary]), нет, но вам нужен заказный вариант для получения вывода столбцов в порядке определения.
  • PSv5+: Определите пользовательский класс и создайте его в каждой итерации цикла - см. Ниже.

В PSv5+ пользовательский класс позволяет использовать элегантное решение, которое также работает лучше, чем создание экземпляров в цикле с использованием литерального синтаксиса.

# Define a custom class that represents the rows of the # output CSV. # Note: [object] is being used here as the properties' type. # In real life, you'd use more specific types such as [string] # or [int]. class CsvRow { [object] ${Example Header 1} [object] ${Example Header 2} } $array = @() foreach ($ndx in 1..2) { # Instantiate the custom class. $rowObj = [CsvRow]::new() # Set the values. $rowObj.'Example Header 1' = $ndx # Add the instance to the array. $array += $rowObj } # Print the array. $array

Рекомендации по производительности

Два фактора определяют производительность:

  • Как быстро массив расширяется в каждой итерации цикла:

    • Расширение элемента массива по элементу с помощью $array +=... очень удобно, но имеет стоимость исполнения, потому что каждый новый массив должен создаваться каждый раз (массивы представляют собой коллекции фиксированного размера и не могут быть напрямую расширены).

    • Для небольшого количества итераций, которые могут не иметь значения, но чем выше число, тем больше производительность будет страдать, и в какой-то момент этот подход становится неосуществимым.

    • Решение состоит в том, чтобы использовать экземпляр [System.Collections.ArrayList] для сборки массива - см. Ниже.

  • Как быстро новый объект создается в каждой итерации цикла:

    • Создание экземпляра пользовательского класса быстрее, чем создание экземпляра через литерал хеш- [CsvRow]::new(), но только если для создания экземпляра используется [CsvRow]::new(); функционально эквивалентный New-Object CsvRow намного медленнее из-за New-Object CsvRow вызова командлета.

Следующий вариант решения для пользовательского класса использует [System.Collections.ArrayList] для обеспечения приемлемой производительности даже при более высоких значениях итераций:

# Define the custom class. class CsvRow { [object] ${Example Header 1} [object] ${Example Header 2} } # Determine the iteration count. $count = 1000 # Create an array list for fast and efficient build-up of the array. $arrayList = [System.Collections.ArrayList]::new() # Loop. foreach ($ndx in 1..$count) { # Instantiate the custom class. $rowObj = [CsvRow]::new() # Set the values. $rowObj.'Example Header 1' = $ndx # Add the instance to the array list. # Note that .Add() produces output, which we don't want # and suppress with $null = ... $null = $arrayList.Add($rowObj) } # Print the array list. $arrayList

qaru.site

powershell - создание powershell script для резервного копирования файла и добавления даты

В этом месяце я сделал ежедневную/недельную/месячную/ежеквартальную/годовую резервную копию script в Powershell и надеюсь, что это поможет.

Этот сценарий резервного копирования DWMQY состоит в том, чтобы застегнуть папку-источник на файл с именем по дате, а затем сохранить почтовые индексы:

  • последние 7 дней
  • 4 недели (каждая пятница)
  • 6 месяцев (последняя пятница каждого месяца)
  • 4 квартала (последний месяц квартала)
  • 2 года (последний квартал года).

Выполняя как запланированную задачу на ежедневной основе, она помещает zip файлы в целевую папку, которая также является локальной папкой Microsoft OneDrive, поэтому zips также удаленно синхронизируется с сервером OneDrive. Эти устаревшие (без пятницы ежедневные или незавершенные DWMQY) почтовые индексы будут перемещены в папку с не удаленными синхронизациями.

Сегодня, 5 марта 2016 года, следующие целевые папки должны находиться в целевой папке:

  • 7 дней: 160304-160229-160227
  • 4 недели: 160304, 160226, 160219, 160212.
  • 6 месяцев: 160226, 160129, 161225, 151127, 151025, 150925
  • 4 квартала: 151225, 150925,150626,150327
  • 2 года: 151225, 141226

Таким образом, будет 23 zips (на самом деле, меньше, чем у DWMQY), наши файлы составляют 250 текстовых документов, что составляет 0,4 ГБ после запечатывания, поэтому он составляет 23 * 0,4 = 9,2 ГБ, что меньше, чем OneDrive free 15 Квота GB.

Для больших исходных данных можно использовать 7-zip, что обеспечивает максимальный размер почтового индекса в 16 мил. Для прямых резервных копий вместо zip файлов не пробовали. Предполагая, что это переносимая процедура с текущего почтового пути.

# Note: there are following paths: # 1. source path: path to be backed up. # 2. target path: current zips stored at, which is also a remote-sync pair local path. # 3. moved-to path: outdated zips to be moved in this non-sync'able location. # 4. temp path: to copy the source file in to avoid zip.exe failing of compressing them if they are occupied by some other process. # Function declaration . C:\Source\zipSaveDated\Functions.ps1 # <1> Zip data $sourcePath = '\\remoteMachine1\c$\SourceDocs\*' $TempStorage = 'C:\Source\TempStorage' $enddate = (Get-Date).tostring("yyyyMMdd") $zipFilename = '\\remoteMachine2\d$\DailyBackupRemote\OneDrive\DailyBackupRemote_OneDrive\' + $enddate + '_CompanyDoc.zip' Remove-Item ($TempStorage + '\*') -recurse -Force Copy-Item $sourcePath $TempStorage -recurse -Force Add-Type -A System.IO.Compression.FileSystem [IO.Compression.ZipFile]::CreateFromDirectory($TempStorage, $zipFilename) # <2> Move old files $SourceDir = "\\remoteMachine2\d$\DailyBackupRemote\OneDrive\DailyBackupRemote_OneDrive" $DestinationDir = "\\remoteMachine2\d$\DailyBackupRemote\bak" # to store files moved out of the working folder (OneDrive) $KeepDays = 7 $KeepWeeks = 4 $KeepMonths = 6 $KeepQuarters = 4 $KeepYears = 2 # <2.1>: Loop files $Directory = $DestinationDir if (!(Test-Path $Directory)) { New-Item $directory -type directory -Force } $files = get-childitem $SourceDir *.* foreach ($file in $files) { # L1 # daily removal will not remove weekly copy, 7 If($file.LastWriteTime -lt (Get-Date).adddays(-$KeepDays).date ` -and $file.LastWriteTime.DayOfWeek -NotMatch "Friday" ` ) { Move-Item $file.fullname $Directory -force } } # L1 >> $files = get-childitem $SourceDir *.* foreach ($file in $files) { # L1 # weekly removal will not remove monthly copy, 4 If($file.LastWriteTime -lt (Get-Date).adddays(-$KeepWeeks * 7).date ` -and (Get-LastFridayOfMonth ($file.LastWriteTime)).Date.ToString("yyyyMMdd") -NotMatch $file.LastWriteTime.Date.ToString("yyyyMMdd") ) { Move-Item $file.fullname $Directory -force } } # L1 >> $files = get-childitem $SourceDir *.* foreach ($file in $files) { # L1 # monthly removal will not remove quarterly copy, 6 If($file.LastWriteTime.Month -lt ((Get-Date).Year - $file.LastWriteTime.Year) * 12 + (Get-Date).Month - $KeepMonths ` -and $file.LastWriteTime.Month -NotIn 3, 6, 9, 12 ) { Move-Item $file.fullname $Directory -force } } # L1 >> $files = get-childitem $SourceDir *.* foreach ($file in $files) { # L1 # quarterly removal will not remove yearly copy, 4 If($file.LastWriteTime.Month -lt ( (Get-Date).Year - $file.LastWriteTime.Year) * 12 + (Get-Date).Month - $KeepQuarters * 3 ` -and $file.LastWriteTime.Month -NotIn 12 ) { Move-Item $file.fullname $Directory -force } } # L1 >> $files = get-childitem $SourceDir *.* foreach ($file in $files) { # L1 # yearly removal will just go straight ahead. 2 If($file.LastWriteTime.Year -lt (Get-Date).Year - $KeepYears ) { Move-Item $file.fullname $Directory -force } } # L1 >> <Functions.ps1> function Get-TimesResult3 { Param ([int]$a,[int]$b) $c = $a * $b Write-Output $c } function Get-Weekday { param( $Month = $(Get-Date -format 'MM'), $Year = $(Get-Date -format 'yyyy'), $Days = 1..5 ) $MaxDays = [System.DateTime]::DaysInMonth($Year, $Month) 1..$MaxDays | ForEach-Object { Get-Date -day $_ -Month $Month -Year $Year | Where-Object { $Days -contains $_.DayOfWeek } } } function Get-LastFridayOfMonth([DateTime] $d) { $lastDay = new-object DateTime($d.Year, $d.Month, [DateTime]::DaysInMonth($d.Year, $d.Month)) $diff = ([int] [DayOfWeek]::Friday) - ([int] $lastDay.DayOfWeek) if ($diff -ge 0) { return $lastDay.AddDays(- (7-$diff)) } else { return $lastDay.AddDays($diff) } }

qaru.site

powershell - Создать файл журнала в Powershell

У меня есть код ниже и в настоящее время он загружает всю информацию на экране. Я хочу, чтобы он записывался в файл журнала D:\Apps\Logs.

В файле журнала должно быть указано имя компьютера, на который он загружается - поэтому COMPUTERNAME.log

Любая идея, как я могу это сделать?

Спасибо

$computer = gc env:computername $onetcp = ((get-childitem c:\windows\system32\drivers\tcpip.sys).Versioninfo.ProductMajorPart).tostring() $twotcp = ((get-childitem c:\windows\system32\drivers\tcpip.sys).Versioninfo.ProductMinorPart).tostring() $threetcp = ((get-childitem c:\windows\system32\drivers\tcpip.sys).Versioninfo.ProductBuildPart).tostring() $fourtcp = ((get-childitem c:\windows\system32\drivers\tcpip.sys).Versioninfo.ProductPrivatePart).tostring() $onedfsr = ((get-childitem c:\windows\system32\dfsrs.exe).Versioninfo.ProductMajorPart).tostring() $twodfsr = ((get-childitem c:\windows\system32\dfsrs.exe).Versioninfo.ProductMinorPart).tostring() $threedfsr = ((get-childitem c:\windows\system32\dfsrs.exe).Versioninfo.ProductBuildPart).tostring() $fourdfsr = ((get-childitem c:\windows\system32\dfsrs.exe).Versioninfo.ProductPrivatePart).tostring() write-host TCPIP.sys Version on $computer is: "$onetcp.$twotcp.$threetcp.$fourtcp" Write-Host write-host DFSRS.exe Version on $computer is: "$onedfsr.$twodfsr.$threedfsr.$fourdfsr" Write-Host If (get-wmiobject win32_share | where-object {$_.Name -eq "REMINST"}) { Write-Host "The REMINST share exists on $computer" } Else { Write-Host "The REMINST share DOES NOT exist on $computer - Please create as per standards" } Write-Host $hotfix1 = Get-HotFix -Id KB2450944 -ErrorAction SilentlyContinue $hotfix2 = Get-HotFix -Id KB2582284 -ErrorAction SilentlyContinue $hotfix3 = Get-HotFix -Id KB979808 -ErrorAction SilentlyContinue If ($hotfix1) { Write-Host "Hotfix KB2450944 is installed" -BackgroundColor Green -ForegroundColor Black } else { Write-Host "Hotfix KB2450944 is NOT installed - Please ensure you install this hotfix" -ForegroundColor "red" } If ($hotfix2) { Write-Host "Hotfix KB2582284 is installed" -BackgroundColor Green -ForegroundColor Black } else { Write-Host "Hotfix KB2582284 is NOT installed - Please ensure you install this hotfix" -ForegroundColor "red" } If ($hotfix3) { Write-Host "Hotfix KB979808 is installed" -BackgroundColor Green -ForegroundColor Black } else { Write-Host "Hotfix KB979808 is NOT installed - Please ensure you install this hotfix" -ForegroundColor "red" } задан lara400 20 окт. '11 в 13:35 источник поделиться

qaru.site

Создание Powershell и XML-файлов

Это первый раз, когда я пытался создать файл XML. Я пытаюсь написать скрипт, который запрашивает наш список объектов групповой политики и генерирует XML-файл с именем имени объекта групповой политики и серверами, к которым применяется.

Я бег на два вопрос:

  • файла XML создается с первым объектом групповой политикой, но я получаю все сервера в «NodeName» метке, а не много.

< MasterList>< Тэг>< TagName> WSUS-АЛЬФА </TagName>< NodeName> SERVER1 SERVER2 SERVER3 сервера4 </NodeName></Tag></MasterList>

  • После того, как первый объект групповой политики записывается в файл XML, я получаю следующие ошибки для отдыха:

Исключение вызова «WriteStartElement» с «1» аргумент (ы): «Писатель закрыто." В строке: 3 символ: 5 + $ xmlWriter.WriteStartElement ('Tag') + ~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~ + CategoryInfo: NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId: InvalidOperationException

Исключение вызова "WriteElementString" с "2" аргумент (ы): «Знак StartElement в состоянии Ошибка приведет к недопустимому XML-документу . " В строке: 4 char: 5 + $ xmlWriter.WriteElementString ('TagName', $ gpo.DisplayName) + ~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId: InvalidOperationException

Исключение, вызывающее «WriteElementString» с аргументом «2»: «Токен StartElement в состоянии Ошибка приведет к недопустимому XML-документу ». В строке: 10 символ: 13 + $ xmlWriter.WriteElementString ('NodeName' (Get-ADGroupMember -Identit ... + ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ + CategoryInfo: NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId: InvalidOperationException

Исключение вызова "WriteEndElement" с "0" аргумент (ы) : «Не было открытого тега начала XML». По строке: 13 символов: 5 + $ xmlWriter.WriteEndElement() + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId: InvalidOperationException

Exception, вызывающий «WriteEndElement» с аргументом «0»: «Не было открытого тега XML открытого». В строке: 14 символ: 5 + $ xmlWriter.WriteEndElement() + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId: InvalidOperationException

Исключение вызова "Flush" с "0" аргумент (ы): "Невозможно записать в закрытом TextWriter" В строке: 15 символов: 5 + $ xmlWriter.Flush() + ~~~~~~~~~~~~~~~~~~ + CategoryInfo: NotSpecified: (:) [ ], MethodInvocationException + FullyQualifiedErrorId: ObjectDisposedException

Вот код, я использую:

$xmlFile = "c:\data-$randomnumber.xml" $xmlWriter = New-Object System.XMl.XmlTextWriter($xmlFile,$Null) $xmlWriter.Formatting = 'Indented' $xmlWriter.Indentation = 1 $xmlWriter.IndentChar = "`t" $xmlWriter.WriteStartElement('MasterList') #Get the list of GPOs that start with "wsus". $wsusGPOs = Get-GPO -All | where {$_.DisplayName -like 'wsus*'} Foreach ($gpo in $wsusGPOs) { #For each GPO that starts with "wsus", create a tag with the GPO's name. $xmlWriter.WriteStartElement('Tag') $xmlWriter.WriteElementString('TagName',$gpo.DisplayName) #Get the list of AD groups that have the "Apply" permission, in each GPO. $wsusPerms = $gpo | Get-GPPermission -All | where {$_.permission -eq 'GpoApply' -and $_.denied -eq $false} Foreach ($permsList in $wsusPerms) { If ($permsList.trustee.name -ne 'Authenticated Users') { #For each AD group that can apply the GPO, get the list of servers in the AD group. Ignores the "Authenticated Users" group. $xmlWriter.WriteElementString('NodeName',(Get-ADGroupMember -Identity $permsList.Trustee.name -Recursive).name) } } $xmlWriter.WriteEndElement() $xmlWriter.WriteEndElement() $xmlWriter.Flush() $xmlWriter.Close() }

Я попытался переместить $ xmlWriter.Flush() и $ xmlWriter.Close() команды из верхней части ch loop, но это не помогло.

Я чувствую, что оба эти вопроса должны быть довольно прямолинейными, я просто не знаю, как это сделать. Любые мысли о том, как мне изменить свой код?

Спасибо.

stackoverrun.com

Создание документа Word с помощью PowerShell

Иногда приходится создавать с помощью PowerShell различные документы (отчеты по серверам, выборки из логов и пр. подобная информация). Обычно данные сохраняются в виде обычного текстового файла, либо  конвертируются в HTML. Но если у вас на компьютере установлен MS Office, то данные можно сохранять в виде документа Word. Итак, предположим, что нам необходимо создать новый документ и добавить в него текст.

Первым делом запускаем Word:

$Word = New-Object -ComObject Word.Application

Приложение запущено, но оно работает в фоновом режиме и остается невидимым для пользователя. В принципе, для создания документа это не обязательно, но если вы хотите видеть результат, то надо сделать его видимым. Для этого необходимо изменить свойство Visible:

$Word.Visible = $true

Cоздаем новый документ:

$Document = $Word.Documents.Add()

Документ открыт, но перед тем, как приступить к его редактированию, необходимо выделить участок текста или весь документ:

$Selection = $Word.Selection

Теперь добавим в документ текст с помощью метода TypeText:

$Selection.TypeText(″PowerShell&Word″)

и сохраним документ в файл:

$File = C:\Temp\psword.doc$Document.SaveAs([ref]$File)

Закрываем документ и выходим из Word:

$Document.Close()$Word.Quit()

 

А теперь откроем созданный файл. Для этого опять запускаем Word и делаем его видимым:

$Word = New-Object -ComObject Word.Application$Word.Visible = $true

Открываем документ:

$File = ″C:\Temp\psword.doc″$Document = $Word.Document.Open($File)

 

И смотрим, что получилось.

Теперь добавим еще пару строк текста. А для того, чтобы разбить текст на строки, используем метод TypeParagraph:

$Selection = $Word.Selection$Selection.TypeParagraph()$Selection.TypeText(″Power″)$Selection.TypeText(″Shell″)$Selection.TypeParagraph()$Selection.TypeText(″&″)$Selection.TypeParagraph()$Selection.TypeText(″Word″)

 

Проверяем результат

Ну и в завершение немного украсим текст. Для этого выберем шрифт:

$Selection.Font.Name = ″Verdana″

Сделаем шрифт жирным (Bold) и наклонным (Italic):

$Selection.Font.Bold = $True$Selection.Font.Italic = $True

Увеличим размер шрифта:

$Selection.Font.Size = 18

И изменим цвет на зеленый:

$Selection.Font.Color = ″wdColorGreen″

Добавляем текст:

$Selection.TypeText(″Word&PowerShell″)

 

В результате получим такую картину

Посмотреть доступные цвета можно командой:

[Enum]::GetNames([Microsoft.Office.Interop.Word.wdColor])

 

И еще, если необходимо сохранить документ в определенном формате (например для обеспечения совместимости) то формат можно указать явно. Вывести список доступных форматов можно командой:

[Enum]::GetNames([Microsoft.Office.Interop.Word.wdSaveFormat])

 

Для примера сохраним документ в формате OpenDocument:

$File = ″C:\Temp\psword.doc″$Document.SaveAs([ref]$SaveFormat::wdFormatOpenDocumentText)$Word.Quit()

 

На этом, пожалуй, все. Узнать больше о свойствах и методах объекта Word.Selection, использующегося для редактирования текста, можно на MSDN. Также здесь есть ряд подробных статей по данной теме.

windowsnotes.ru