Просмотр полной версии : PowerShell. Советы, методы, итд.
NaX[no]rT
11.07.2008, 08:49
В этом разделе будем обсуждать, делиться накопленным опытом по работе с PowerShell.
Кто не знаком, PowerShell - это оболочка, которая очень похожа на (cmd.exe). PS позволяет автоматизировать задачи, которые на первый взгляд имеют очень сложное решение.
На мой взгляд, самое долгожданное удобство - alias'ы.
Привыкли сидеть в *NIX'ах? - пожалуйста, переход будет не очень болезненный, т.к. большинство алиасов поддерживается.
Например:
PS U:\> ps e*
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
637 17 21628 32968 130 81,59 2436 explorer
Вообще средствами PowerShell можно работать с системой без графического интерфейса.
Очень порадовала поддержка .NET платформы. Правильно, можете писать всё что угодно "на" PowerShell.
P.S.: немного позже будет написана статья (вместо ---^), в которой я ознакомлю Вас с основными методами работы. А так же свои наработки и примеры решений повседневных задач администрирования. В статье будут выработаны пути решения рутинных задач.
SpangeBoB
19.07.2008, 13:45
Теперь PoSH можно использовать в ASP.
What is PowerShell ASP?
PowerShellASP is an ASP-like template language for Web Applications; templates contain a mixture of markup (HTML, XML or whatever you want to generate) and inline PowerShell code. At runtime, templates/pages are fully translated to PowerShell code and executed as a single unit inside a PowerShell pipeline, with the results sent to the client browser.
PowerShellASP runs off the ASP.NET platform, implemented as a custom IHttpHandler mapped to *.ps1x files. Because of this, you can mix PowerShellASP pages alongside any ASP.NET application. This provides a great way to leverage PowerShellASP inside your existing applications as needed or you can create complete applications from scratch based only on *.ps1x pages.
http://www.powershelltoys.com/default.aspx
Windows Monad Shell (Windows PowerShell):
#Обзор Windows Monad Shell (часть 1)
# Обзор Windows Monad Shell (часть 2)
# Настройка Windows Monad Shell
# Создание сценариев Windows Monad Shell
# Управление контекстом, работа со специальными символами, регулярными выражениями и обработка ошибок в Windows Monad Shell
# Работа с содержимым файлов, классами .NET и COM-объектами в Windows Monad Shell
# Работа с журналом событий, управление системными службами, использование WMI и управление разрешениями файловой системы в Windows Monad Shell
# Некоторые рецепты практической работы в Windows Monad Shell
и не только
http://www.script-coding.info/
и
http://www.oszone.net/4781/PowerShell
procedure
11.11.2008, 03:51
Помню, видел много видеороликов на данную тему, наверное на techdays.ru сейчас поищу.
p.s. Нашел, вот тут.Видео, на данную тему. (http://www.techdays.ru/Search.aspx?Subject=521aeb1e-7fd2-41ef-baa5-19622e101139)
А тут прямая ссылка (http://www.techdays.ru/Lecture.aspx?LID=e2255a28-4251-4ed0-b9d7-d987d56bd9cf)
http://www.oszone.net/4781/PowerShell - а тут еще дополнительно
SpangeBoB
11.11.2008, 13:02
Большой список полезной информации от русского MVP по Powershell Василия Гусева ,собственно его вебтрансляции и на techdays.ru
http://xaegr.wordpress.com/poshlinks/
Знакомство с Windows PowerShell (документация)
Вот неплохой материал:
Скачать (http://www.bankreferatov.ru/db/M/1D30FBC552990586C32573310062CBCC)
jawbreaker
07.12.2008, 12:30
PowerGUI (http://powergui.org/index.jspa) - IDE-шка для PowerShell с возможностями отладки
SpangeBoB
15.01.2010, 01:34
Потребовалось сделать простенький скрип на powershell =)
Есть 2 файла в одном:
192.168.1.10 ivanov
192.168.1.11 petrov
192.168.1.12 sidorov
192.168.0.13 kozlov
..........................................
192.168.1.10 pc1 00:11:22:33:44:55
192.168.1.11 pc2 00:1a:2a:3a:4a:5a
192.168.1.12 pc3 00:2a:3a:4a:5a:6a
192.168.1.13 pc4 00:3a:4a:5a:6a:7a
.................................................. ....................
Требуется:
192.168.1.10 pc1 ivanov 00:11:22:33:44:55
param ($file1,$file2)
$file1 = Get-Content $file1
$file2 = Get-Content $file2
foreach ($i in $file2)
{
foreach ($j in $file1)
{
if ($i.split()[0] -eq $j.split()[0])
{
$i -replace " (\w|\d|\W)* ","`$0$($j.split()[1]) "
}
}
}
SpangeBoB
21.01.2010, 00:31
Может кому потребуется.Вопрос был задан в Irc и был решен с помощью Total Commander.Но без стороних средств решается довольно просто.
powershell
dir PATH | ? {(!$_.PSiscontainer) -and !($_.extension)} | % { ren $_.fullname ($_.fullname+".jpg")}
bat
cd PATH
for /F %%i in ('dir *. /a:-d /b') do (ren %%i %%i.jpg)
SpangeBoB
22.02.2010, 15:48
Простая функция получения Rss c antichat.
Function Get-AntichatRss {
$client = New-Object System.Net.WebClient
$url = "http://forum.antichat.ru/news.rss"
[xml]$results = [System.Text.Encoding]::GetEncoding('windows-1251').GetString([Byte[]]$client.DownloadData($url))
$channel = $results.rss.channel
foreach ($item in $channel.item) {
$result = New-Object PSObject
$result | Add-Member NoteProperty Title -value $item.title
$result | Add-Member NoteProperty Link -value $item.link
$result | Add-Member NoteProperty Date -value $([System.Datetime]::Parse($item.date).tostring())
$result | Add-Member NoteProperty Creator -value $item.creator
$result
}
}
Get-AntichatRss вывод:
Title Link Date Creator
----- ---- ---- -------
нужно восстановить почту н... http://forum.antichat.ru/s... 22.02.2010 11:38:45 IgAlex
Так же без обезания.
Get-AntichatRss | fl *
И допустим получить последние 3 сообщения:
Get-AntichatRss | select -first 3 | fl *
Или получить приятный интерактивный вывод:
Get-AntichatRss | Out-GridView -Title "Antichat Rss"
http://img163.imageshack.us/img163/7720/posh.jpg (http://img163.imageshack.us/i/posh.jpg/)
SpangeBoB
23.02.2010, 21:41
Продолжая вчерашний пост про RSS.Благодаря MVP Василию Гусеву по PowerShell ,я немного подрихтовал его скрипт и адаптировал для получения RSS с античат.Его скрипт http://xaegr.wordpress.com/2009/01/19/pstwitps1/ .
http://img684.imageshack.us/img684/7618/40553903.png (http://img684.imageshack.us/i/40553903.png/)
http://img691.imageshack.us/img691/2166/15168072.png (http://img691.imageshack.us/i/15168072.png/)
################################################## #############################
#
# Скрипт получения записей с RSS Antichat.Сам скрипт был взят у автора и немного
# подправлен.Часть данных было выкинуто.
#
# Copyright (C) Vasily Gusev, 2009 (http://windowspowershell.ru)
#
# Requres PowerShell v2
# Usage:
#
# powershell -NoProfile -WindowStyle Hidden -File c:\rssantichat.ps1
# powershell -NoProfile -WindowStyle Hidden -Command c:\rssantichat.ps1 -Icon c:\icon.ico
#
################################################## ############################
Param (
$Interval = 60,
$Icon = "$env:SystemRoot\system32\appverif.ico"
)
[Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
$form = new-object System.Windows.Forms.form
$ni = new-object System.Windows.Forms.NotifyIcon
$niMenu = new-object System.Windows.Forms.ContextMenu
$t = New-Object system.windows.forms.timer
#Устанавливаем свойства элементов управления
$t.Interval = $Interval * 1000
$form.ShowInTaskbar = $False
$form.WindowState = "minimized"
$form.Visible = $false
$ni.Icon = New-object System.Drawing.Icon($Icon)
$ni.ContextMenu = $niMenu
#Создаем элементы меню - Exit
$miExit = new-object System.Windows.Forms.MenuItem
$miExit.Text = "Exit" #Текст меню
$miExit.Add_Click({ #Действие выполняемое при щелчке на элементе
$ni.Visible = $False
$form.close() #При закрытии этой формы, выполнение нашего сценария завершиться
})
#При выборе этого пункта будет вызвана функция Check (см. ниже)
$miCheck = new-object System.Windows.Forms.MenuItem
$miCheck.Text = "Check now!"
$miCheck.Add_Click({Check})
#Вызовет функцию List
$miList = new-object System.Windows.Forms.MenuItem
$miList.Text = "View list"
$miList.Add_Click({Check;List})
#Добавляем элементы в меню
$niMenu.MenuItems.AddRange(@($miList,$miCheck,$miE xit))
#Привязываем к двойному щелчку на значке в области уведомлений вызов функции List
$ni.add_DoubleClick({Check;List})
Function Check
{
write-host "Checking feed $(get-date)"
#Загружаем ленту, и сразу преобразоываем её в xml
$client = New-Object System.Net.WebClient
$url = "http://forum.antichat.ru/news.rss"
$global:timeline = [xml]([System.Text.Encoding]::GetEncoding('windows-1251').GetString([Byte[]]$client.DownloadData($url)))
Write-host "Done $(get-date)"
}
Function List
{
#Создаем элементы
$formList = New-Object system.windows.forms.form
$list = New-Object system.windows.forms.listview
#Задаём их свойства
$formList.controls.add($list)
$formList.width = 700
$formList.height = 350
$formList.Text = "Rss Antichat"
$list.dock="fill"
$List.View = "Details"
$List.MultiSelect = $false
$List.FullRowSelect = $True
$List.Columns.Add("Title").width = 300
$List.Columns.Add("Link").width = 200
$List.Columns.Add("Date").width = 100
$List.Columns.Add("Creator").width = 70
#Добавляем записи
$global:timeline.rss.channel.item |
foreach {
$I = $List.Items.Add($_.title)
$I.SubItems.Add($_.link) | Out-Null
$I.SubItems.Add($([System.Datetime]::Parse($_.date).tostring())) | Out-Null
$I.SubItems.Add($_.Creator) | Out-Null
}
#Указываем что делать при двойном щелчке на списке
$List.Add_DoubleClick({
if($List.SelectedItems.Count -ge 1)
{
Write-Host ($list.SelectedItems[0].subitems[1].text)
#Открываем Internet Explorer и передаем url выбранного элемента как аргумент
& "$env:ProgramFiles\Internet Explorer\iexplore.exe" $list.SelectedItems[0].subitems[1].text
}
})
#Показываем форму
$formList.ShowDialog()
}
#Указываем что при каждом тике таймера, вызывать функцию Check
$t.add_tick({Check})
#Включаем таймер
$t.start()
#Показываем значок в области уведомлений
$NI.Visible = $True
#"Показываем" невидимую форму (когда она закроется - сценарий завершиться)
$form.showdialog()
SpangeBoB
02.03.2010, 01:29
Для создания базовых элементов Windows Form на Powershell,есть замечательная программа от Sapien под названием PrimalForms( http://www.primaltools.com/downloads/communitytools/download.asp?file=pforms ) . С помощью нее можно быстро создать базовые элементы,так же можно использовать Visual Studio( здесь будет сложнее,код создается на C# ,в программе выше сразу имеем код на PowerShell).Так же другие полезные программы от Sapien для PowerShell на сайте http://www.primaltools.com/downloads/communitytools/index.asp
PrimalForms Community Edition is a free GUI builder tool for PowerShell users. It edits and stores Windows Forms in a native XML format and generates PowerShell code on demand. Sample forms included.
И сделал с помощью PrimalForms простой пример с удалением дублей без учета регистра.Просто небольшой показ возможностей.
Наша форма:
http://img23.imageshack.us/img23/6851/uniq.png (http://img23.imageshack.us/i/uniq.png/)
Ничего сверхестественного скрипт не делает,а лишь выполняет команду:
Get-Content "$filename" | Select-Object -Unique | Out-File "$savename"
Сам скрипт:
#Generated Form Function
function GenerateForm {
################################################## ######################
# Code Generated By: SAPIEN Technologies PrimalForms (Community Edition)
# Generated On: 02.03.2010
# Generated By: SpangeBoB
################################################## ######################
#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
#endregion
#region Generated Form Objects
$form1 = New-Object System.Windows.Forms.Form
$button4 = New-Object System.Windows.Forms.Button
$button3 = New-Object System.Windows.Forms.Button
$richTextBox2 = New-Object System.Windows.Forms.RichTextBox
$richTextBox1 = New-Object System.Windows.Forms.RichTextBox
$button2 = New-Object System.Windows.Forms.Button
$button1 = New-Object System.Windows.Forms.Button
$openFileDialog1 = New-Object System.Windows.Forms.OpenFileDialog
$saveFileDialog1 = New-Object System.Windows.Forms.SaveFileDialog
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects
#----------------------------------------------
#Generated Event Script Blocks
#----------------------------------------------
#Provide Custom Code for events specified in PrimalForms.
$button3_OnClick=
{
#TODO: Place custom script here
$form1.close()
}
$button1_OnClick=
{
#TODO: Place custom script here
$openFileDialog1.InitialDirectory = "C:\"
$openFileDialog1.Filter = "All files (*.*)| *.*"
$openFileDialog1.FilterIndex = 2
$openFileDialog1.RestoreDirectory = $true
if($openFileDialog1.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK)
{
try
{
if (($filename=$openFileDialog1.OpenFile().Name) -ne $null)
{
$richTextBox1.Text=$filename
}
}
catch
{
[System.Windows.Forms.MessageBox]::Show("Error: Could not read file from disk. Original error: " + $error[0].Exception.Message)
}
}
}
$handler_openFileDialog1_FileOk=
{
#TODO: Place custom script here
}
$handler_saveFileDialog1_FileOk=
{
#TODO: Place custom script here
}
$button2_OnClick=
{
#TODO: Place custom script here
$saveFileDialog1.InitialDirectory = "C:\"
$saveFileDialog1.Filter = "All files (*.*)| *.*"
$saveFileDialog1.FilterIndex = 2
$saveFileDialog1.RestoreDirectory = $true
if($saveFileDialog1.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK)
{
try
{
if (($savename=$saveFileDialog1.OpenFile().Name) -ne $null)
{
$richTextBox2.Text=$savename
}
}
catch
{
[System.Windows.Forms.MessageBox]::Show("Error: Could not save file from disk. Original error: " + $error[0].Exception.Message)
}
}
}
$handler_form1_Load=
{
#TODO: Place custom script here
}
$button4_OnClick=
{
Write-Host $filename
Write-Host $savename
$saveFileDialog1.Reset()
Get-Content "$filename" | Select-Object -Unique | Out-File "$savename"
}
$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
$form1.WindowState = $InitialFormWindowState
}
#----------------------------------------------
#region Generated Form Code
$form1.Text = 'Get Uniq'
$form1.Name = 'form1'
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 456
$System_Drawing_Size.Height = 205
$form1.ClientSize = $System_Drawing_Size
$form1.add_Load($handler_form1_Load)
$button4.TabIndex = 7
$button4.Name = 'button4'
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 87
$System_Drawing_Size.Height = 25
$button4.Size = $System_Drawing_Size
$button4.UseVisualStyleBackColor = $True
$button4.Text = 'Run'
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 323
$System_Drawing_Point.Y = 168
$button4.Location = $System_Drawing_Point
$button4.DataBindings.DefaultDataSourceUpdateMode = 0
$button4.add_Click($button4_OnClick)
$form1.Controls.Add($button4)
$button3.TabIndex = 6
$button3.Name = 'button3'
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 87
$System_Drawing_Size.Height = 25
$button3.Size = $System_Drawing_Size
$button3.UseVisualStyleBackColor = $True
$button3.Text = 'Exit'
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 30
$System_Drawing_Point.Y = 168
$button3.Location = $System_Drawing_Point
$button3.DataBindings.DefaultDataSourceUpdateMode = 0
$button3.add_Click($button3_OnClick)
$form1.Controls.Add($button3)
$richTextBox2.Name = 'richTextBox2'
$richTextBox2.Text = ''
$richTextBox2.DataBindings.DefaultDataSourceUpdate Mode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 38
$System_Drawing_Point.Y = 109
$richTextBox2.Location = $System_Drawing_Point
$richTextBox2.Multiline = $False
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 279
$System_Drawing_Size.Height = 21
$richTextBox2.Size = $System_Drawing_Size
$richTextBox2.TabIndex = 5
$form1.Controls.Add($richTextBox2)
$richTextBox1.Name = 'richTextBox1'
$richTextBox1.Text = ''
$richTextBox1.DataBindings.DefaultDataSourceUpdate Mode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 38
$System_Drawing_Point.Y = 48
$richTextBox1.Location = $System_Drawing_Point
$richTextBox1.Multiline = $False
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 279
$System_Drawing_Size.Height = 21
$richTextBox1.Size = $System_Drawing_Size
$richTextBox1.TabIndex = 4
$form1.Controls.Add($richTextBox1)
$button2.TabIndex = 3
$button2.Name = 'button2'
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 99
$System_Drawing_Size.Height = 21
$button2.Size = $System_Drawing_Size
$button2.UseVisualStyleBackColor = $True
$button2.Text = 'Save'
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 323
$System_Drawing_Point.Y = 109
$button2.Location = $System_Drawing_Point
$button2.DataBindings.DefaultDataSourceUpdateMode = 0
$button2.add_Click($button2_OnClick)
$form1.Controls.Add($button2)
$button1.TabIndex = 1
$button1.Name = 'button1'
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 99
$System_Drawing_Size.Height = 21
$button1.Size = $System_Drawing_Size
$button1.UseVisualStyleBackColor = $True
$button1.Text = 'Open'
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 323
$System_Drawing_Point.Y = 48
$button1.Location = $System_Drawing_Point
$button1.DataBindings.DefaultDataSourceUpdateMode = 0
$button1.add_Click($button1_OnClick)
$form1.Controls.Add($button1)
$openFileDialog1.ShowHelp = $True
$openFileDialog1.FileName = 'file'
$openFileDialog1.add_FileOk($handler_openFileDialo g1_FileOk)
$saveFileDialog1.ShowHelp = $True
$saveFileDialog1.FileName = 'file'
$saveFileDialog1.add_FileOk($handler_saveFileDialo g1_FileOk)
#endregion Generated Form Code
#Save the initial state of the form
$InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
$form1.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$form1.ShowDialog()| Out-Null
} #End Function
#Call the Function
GenerateForm
SpangeBoB
08.03.2010, 01:39
Еще один небольшой пример работы с PrimalForms, а именно получение IP по имени и на оборот имени по IP(так сказать минимальная возможность nslookup). Проверку на валидность IP ,здесь я взял regex с сайта http://www.regular-expressions.info/examples.html .
http://img408.imageshack.us/img408/6422/hosttoip.png (http://img408.imageshack.us/i/hosttoip.png/)
#Generated Form Function
function GenerateForm {
################################################## ######################
# Code Generated By: SAPIEN Technologies PrimalForms (Community Edition) v1.0.8.0
# Generated By: SpangeBoB
################################################## ######################
#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
#endregion
#region Generated Form Objects
$form1 = New-Object System.Windows.Forms.Form
$label2 = New-Object System.Windows.Forms.Label
$label1 = New-Object System.Windows.Forms.Label
$button1 = New-Object System.Windows.Forms.Button
$richTextBox2 = New-Object System.Windows.Forms.RichTextBox
$richTextBox1 = New-Object System.Windows.Forms.RichTextBox
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects
#----------------------------------------------
#Generated Event Script Blocks
#----------------------------------------------
#Provide Custom Code for events specified in PrimalForms.
$button1_OnClick=
{
if (($name=$richTextBox1.Text))
{
try {
if ($name -match '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b')
{
$ip=[System.Net.IPAddress]::Parse($name).IPAddressToString
$richTextBox2.Text = [System.Net.Dns]::GetHostByAddress($ip).HostName
}
else {
$ip = [System.Net.Dns]::GetHostAddresses($name) | ForEach-Object { $_.IPAddressToString}
$ofs = ","
$richTextBox2.Text = $ip
}
}
catch [System.Management.Automation.MethodInvocationExcep tion]
{
[System.Windows.Forms.MessageBox]::Show("Enter correct host!")
}
}
else { [System.Windows.Forms.MessageBox]::Show("Enter host!")}
}
$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
$form1.WindowState = $InitialFormWindowState
}
#----------------------------------------------
#region Generated Form Code
$form1.Text = "Simple Resolve"
$form1.Name = "form1"
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 404
$System_Drawing_Size.Height = 129
$form1.ClientSize = $System_Drawing_Size
$label2.TabIndex = 4
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 22
$System_Drawing_Size.Height = 24
$label2.Size = $System_Drawing_Size
$label2.Text = "IP"
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 28
$System_Drawing_Point.Y = 62
$label2.Location = $System_Drawing_Point
$label2.DataBindings.DefaultDataSourceUpdateMode = 0
$label2.Name = "label2"
$form1.Controls.Add($label2)
$label1.TabIndex = 3
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 34
$System_Drawing_Size.Height = 21
$label1.Size = $System_Drawing_Size
$label1.Text = "Host"
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 28
$System_Drawing_Point.Y = 12
$label1.Location = $System_Drawing_Point
$label1.DataBindings.DefaultDataSourceUpdateMode = 0
$label1.Name = "label1"
$form1.Controls.Add($label1)
$button1.TabIndex = 2
$button1.Name = "button1"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 57
$System_Drawing_Size.Height = 27
$button1.Size = $System_Drawing_Size
$button1.UseVisualStyleBackColor = $True
$button1.Text = "Resolve"
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 324
$System_Drawing_Point.Y = 35
$button1.Location = $System_Drawing_Point
$button1.DataBindings.DefaultDataSourceUpdateMode = 0
$button1.add_Click($button1_OnClick)
$form1.Controls.Add($button1)
$richTextBox2.Name = "richTextBox2"
$richTextBox2.ScrollBars = 0
$richTextBox2.Text = ""
$richTextBox2.DataBindings.DefaultDataSourceUpdate Mode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 71
$System_Drawing_Point.Y = 62
$richTextBox2.Location = $System_Drawing_Point
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 229
$System_Drawing_Size.Height = 36
$richTextBox2.Size = $System_Drawing_Size
$richTextBox2.TabIndex = 1
$form1.Controls.Add($richTextBox2)
$richTextBox1.Name = "richTextBox1"
$richTextBox1.MaxLength = 255
$richTextBox1.ScrollBars = 0
$richTextBox1.Text = ""
$richTextBox1.DataBindings.DefaultDataSourceUpdate Mode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 71
$System_Drawing_Point.Y = 12
$richTextBox1.Location = $System_Drawing_Point
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 231
$System_Drawing_Size.Height = 22
$richTextBox1.Size = $System_Drawing_Size
$richTextBox1.TabIndex = 0
$form1.Controls.Add($richTextBox1)
#endregion Generated Form Code
#Save the initial state of the form
$InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
$form1.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$form1.ShowDialog()| Out-Null
} #End Function
#Call the Function
GenerateForm
SpangeBoB
15.03.2010, 03:36
Написал для себя скрипт ,который мониторит папку на события Changed, Created, Deleted и Renamed . Для этого воспользовался классом FileSystemWatcher - класс (http://msdn.microsoft.com/ru-ru/library/system.io.filesystemwatcher.aspx) . Есть одна неприятность если явно не указано свойство SynchronizingObject ,то Powershell завершает свою работу.Поэтому в скрипт пришлось добавить объект Form(спасибо /\/\o\/\/ ).Для остановки скрипта добавим в область уведомления ярлык с единственным возможным действием Exit.
Когда события Changed, Created, Deleted и Renamed обрабатываются компонентом Windows Forms, таким как Button, доступ к данному компоненту через системную группу потоков может не работать или же может возникнуть исключение. Этого можно избежать, задав в свойстве SynchronizingObject компонент Windows Forms, вызывающий методы, обрабатывающие события Changed, Created, Deleted и Renamed, вызванные в том же потоке, в котором был создан данный компонент.
param ([string]$folder,
$Icon = "$env:SystemRoot\system32\appverif.ico"
)
$form = new-object System.Windows.Forms.Form
$ni = new-object System.Windows.Forms.NotifyIcon
$niMenu = new-object System.Windows.Forms.ContextMenu
$watcher = New-Object System.IO.FileSystemWatcher $folder
$ni.Icon = New-object System.Drawing.Icon($Icon)
$ni.ContextMenu = $niMenu
$miExit = new-object System.Windows.Forms.MenuItem
$miExit.Text = "Exit"
$miExit.Add_Click({ $ni.Visible = $False
$form.close() })
$niMenu.MenuItems.AddRange(@($miExit))
$watcher.IncludeSubDirectories = $true
$watcher.SynchronizingObject = $form
$form.ShowInTaskbar = $False
$form.WindowState = "minimized"
$watcher.NotifyFilter = [System.IO.NotifyFilters]::LastAccess , [System.IO.NotifyFilters]::LastWrite, [System.IO.NotifyFilters]::FileName,[System.IO.NotifyFilters]::DirectoryName
$watcher.add_Changed({
Write-Host "$((get-date).ToShortTimeString()) : $($_.FullPath) $($_.ChangeType)"
})
$watcher.add_Created(
{Write-Host "$((get-date).ToShortTimeString()) : $($_.FullPath) $($_.ChangeType)"
})
$watcher.add_Deleted({
Write-Host "$((get-date).ToShortTimeString()) : $($_.FullPath) $($_.ChangeType)"
})
$watcher.add_Renamed({
Write-Host "$((get-date).ToShortTimeString()) : $($_.OldFullPath) renamed to $($_.FullPath) $($_.ChangeType)"
})
$watcher.EnableRaisingEvents = $true
$NI.Visible = $True
$form.showdialog()
Вывод:
2:36 : F:\1\3.txt Deleted
2:36 : F:\1\New Text Document.txt Deleted
2:36 : F:\1\2.txt Deleted
2:36 : F:\1\2 (2).txt Deleted
SpangeBoB
22.03.2010, 17:18
Известно,что PowerShell позволяет использовать WinApi функции в своих скриптах.Один из MVP Shay Levi продемонстировал ,как скрыть ярлыки рабочего стола с помощью функции ShowWindow ( http://blogs.microsoft.co.il/blogs/scriptfanatic/archive/2009/05/11/show-or-hide-your-desktop-icons-with-powershell.aspx).
Немного добавив в его скрипт ,мы можем скрывать и другие окна.Я думаю это полезный пример и просто совет на будущее.
#requires -Version 2.0 - указывает ,что требуется версия PowerShell 2.0.
#requires -Version 2.0
#Задаем процесс,окно которого будем скрывать.
param ([string]$pname = 'calc')
#Указываем какие WinApi функции будем импортировать,хороший сайт http://www.pinvoke.net/
$signature = @"
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd,int nCmdShow);
"@
$win = Add-Type -MemberDefinition $signature -Name Window `
-Namespace UseWinAPI -passThru
#Получаем Handle окна процесса.
$hWnd = (Get-Process -Name $pname).MainWindowHandle
#Скрываем окно.
Function Hide-Window { $null = $win::ShowWindow($hWnd,0) }
#Восстанавливаем скрытое нами окно.
Function Show-Window { $null = $win::ShowWindow($hWnd,5) }
SpangeBoB
28.03.2010, 03:30
Была затронута тема отправка файла на FTP.Существует большое колличество способов и пару простых способов продемонстрирую.
1)Использование стандартного клиента ftp.exe.
2)Использование класса FtpWebRequest Class (http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.aspx)
$inputfile = "F:\1.txt"
$ftphost = "127.0.0.1"
$ftpfilepath = "/1.txt"
$ftpfullpath = "ftp://" + $ftphost + $ftpfilepath
$username="ftp"
$password="ftp"
$ftp = [System.Net.FtpWebRequest]::create($ftpfullpath)
$ftp.Credentials = New-Object System.Net.NetworkCredential($username,$password)
$ftp.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
$ftp.UseBinary = $true
$ftp.KeepAlive = $true
$fs = [System.IO.File]::OpenRead($inputfile)
[Void][Byte[]]$buffer = New-Object byte[] ($fs.length)
$fs.Read($buffer, 0, $buffer.Length)
$fs.Close()
$ftpstream = $ftp.GetRequestStream()
$ftpstream.Write($buffer, 0, $buffer.Length)
$ftpstream.Close()
Поддержка Proxy :
If the specified proxy is an HTTP proxy, only the DownloadFile, ListDirectory, and ListDirectoryDetails commands are supported.
3)Использование библиотеки BytesRoad.NetSuit ,возможна работа с Proxy (Socks4,5,HTTP)
Загрузить библиотеку можно по адресу - http://coad.net/blog/resources/BytesRoad.NetSuit_2_0.zip
[Void][System.Reflection.Assembly]::LoadFrom("F:\BytesRoad.Net.Ftp.dll")
[Void][System.Reflection.Assembly]::LoadFrom("F:\BytesRoad.Net.Sockets.dll")
[Void][System.Reflection.Assembly]::LoadFrom("F:\BytesRoad.Diag.dll")
Function UploadToFTP ()
{
param (
#Настройки подключения
#Удаленный сервер
$FtpServer = "127.0.0.1",
#Имя пользователя для ftp
$Username = "ftp",
#Пароль пользователя для ftp
$Password = "ftp",
#Папка на удаленном сервер
$RemotePath = "/",
#10 секунд
$Timeout = 10000,
#Файл для отправки
$LocalFile = "F:\1.txt",
#Настройки прокси
#Удаленный сервер
$pserver = "127.0.0.1",
#Порт
$pport = 3128,
#Имя пользователя для proxy
$puser = "test",
#Пароль пользователя для proxy
$ppasword = "test",
#Работаем с прокси или нет.
[switch]$IsProxy
)
$client = New-Object BytesRoad.Net.Ftp.FtpClient
$client.PassiveMode = $true
if ($IsProxy)
{
$proxy = New-Object BytesRoad.Net.Ftp.FtpProxyInfo
$proxy.Server = $pserver
$proxy.Port = $pport
$proxy.Type = [BytesRoad.Net.Ftp.FtpProxyType]::Socks5
$proxy.User = $puser
$proxy.Password = $ppasword
$client.ProxyInfo = $proxy
}
$client.Connect($Timeout, $FtpServer, 21)
$client.Login($Timeout, $Username, $Password)
$target = [System.IO.Path]::Combine($RemotePath,[System.IO.Path]::GetFileName($LocalFile)).Replace("\\", "/")
$client.PutFile($Timeout, $target, $LocalFile)
$client.Disconnect($Timeout)
}
#Запустит выполнение функции с определенными выше параметрами.
UploadToFTP
<#
UploadToFTP -IsProxy (если трубется поддержка прокси,параметры указать в функции)
Переопределить параметры ,которые указанны в функции
UploadToFTP -FtpServe "myserver.ru" -Username "Test" -Password "Test" -RemotePath "\\folderonserver/" -Timeout -IsProxy
#>
SpangeBoB
29.03.2010, 00:21
Написал для себя простую функцию для получения всех локальных профилей на машине.
Function Get-AllProfiles ()
{
$path = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'
Get-ChildItem $path | ForEach-Object `
-Begin {$profiles=@()} `
-Process {$ppath = "" | select UserName,Sid,ProfilePath
$ppath.Sid = $_.PsChildName
$ppath.ProfilePath = (Get-ItemProperty ($path + "\" + $_.PsChildName)).ProfileImagePath
$ppath.UserName = Split-Path $ppath.ProfilePath -Leaf
$profiles+=$ppath
} `
-End {$profiles }
}
Get-AllProfiles | ft -auto
Вывод:
http://img704.imageshack.us/img704/7561/profiles.png (http://img704.imageshack.us/i/profiles.png/)
Или используя:
Get-AllProfiles | Out-GridView
http://img440.imageshack.us/img440/2098/prof2.png (http://img440.imageshack.us/i/prof2.png/)
SpangeBoB
05.04.2010, 23:04
На одном из форумов был задан вопрос - "Нужно распечатать 1000 *.pdf файлов. Но только первую страницу каждого из файлов. "
Решение конечно не красивое,но рабочее.Что требуется:
1)Качаем http://sourceforge.net/projects/pdfsharp/files/pdfsharp/PDFsharp%201.31/PDFsharp-MigraDocFoundation-Assemblies-1_31.zip/download
2)Распаковываем.
3)Наличие Adobe Reader.
4)Свободное место.
Суть скрипта создаем новый файл только с первой страницей (в данном случаем в F:\print\ - заменить на свое ) и распечатываем ее.Т.е у нас будет создано 1000 файлов и в каждом только 1 страница.
#Папка куда складываем каждую первую страницу.
$pathToSave = "F:\print\"
[System.Reflection.Assembly]::LoadFile('F:\PdfSharp.dll')
#Обязательное требование Adobe Reader
[PdfSharp.Pdf.Printing.PDFFilePrinter]::AdobeReaderPath = "C:\Program Files (x86)\Adobe\Reader 9.0\Reader\AcroRd32.exe"
Get-ChildItem F:\ -Filter *.pdf | ForEach-Object {
$filename = $_.FullName
$name = [System.IO.Path]::GetFileNameWithoutExtension($filename)
$inputname = [PdfSharp.Pdf.Io.Pdfreader]::Open($filename,[PdfSharp.Pdf.IO.PdfDocumentOpenMode]::Import)
$outfile = New-Object PdfSharp.Pdf.PdfDocument
$outfile.Version = $inputname.Version
$outfile.Info.Title = [String]::Format("Page {0} of {1}", 1, $inputname.Info.Title)
$outfile.Info.Creator = $inputname.Info.Creator
$outfile.AddPage($inputname.Pages[0])
$outfile.Save($pathToSave+[String]::Format("{0} - Page {1}.pdf", $name, 1))
$printer = New-Object PdfSharp.Pdf.Printing.PDFFilePrinter([System.String]($pathToSave+[String]::Format("{0} - Page {1}.pdf", $name, 1)) , [System.String]"HP LaserJet 6L")
$printer.Print()
}
'F:\PdfSharp.dll' - заменяем на путь куда распаковали
Get-ChildItem F:\ -Filter *.pdf - для примера искать pdf в корне диска
Пример работы взят с сайта http://www.pdfsharp.net/wiki/PDFsharpSamples.ashx
SpangeBoB
06.04.2010, 13:57
Есть файл с логами формат:
xxxxx
yyyyy zzzzzzz
xxxxx
yyyyy zzzzzzz
Требуется вывод: xxxxx yyyyy zzzzzzz
За одно используем особенность ,которую описал в своем блоге MVP PowerShell Marc van Orsouw (http://thepowershellguy.com/blogs/posh/archive/2007/10/23/how-to-go-to-the-next-item-in-a-for-loop-in-powershell.aspx)
foreach ($i in (gc log.txt)) { [void]$foreach.moveNext();$i+$foreach.current}
Как выше было сказано,что при вызове MoveNext() не обновляется переменная (в данном случае $i) ,а используется $foreach.current
SpangeBoB
26.05.2010, 21:33
На форуме был задан вопрос:
Есть MS Outlook, есть к нему плагин Potolook (автоматически отвечает написьма)
Приходит письмо в оутлок такого вида
txn_id= 7246926710001
account= 9088688743
amount= 99.00
account1= None
надо чтоб Potolook (JavaScript)
изменял число 99.00 таким образом "99.00+((99.00/100)*15)" в общем прибавлял процент, и результат будет отправляться на другой мэил с обработанным числом НЕ изменяя не тему, не другое содержимое числа помоги это как то осущиствить
Т.к я не знаю JavaScript,решение было на PowerShell.
$ou = New-Object -com outlook.application
$ns = $ou.GetNamespace("MAPI")
#Отбираем только последнее письмо из папки Входящие,содержащим txn_id
$change=$ns.GetDefaultFolder(6).Items | Where-Object { $_.body -like "*txn_id=*"} | Select-Object -First 1
$change.body -match "amount= (.+)" | Out-Null
#Считаем по заданной формуле
$cal = [float]$matches[1]+(([float]$matches[1]/100)*15)
$change.body = $change.body -replace "amount=.+","amount= $cal"
Вот таким не хитрым действием ,мы решили проблему ;)
SpangeBoB
06.06.2010, 17:15
Как удалить с помощью скрипта файлы в корзине:
(New-Object -ComObject Shell.Application).NameSpace(0x0a).Items() | Remove-Item -Path {$_.path}
Константы ShellSpecialFolderConstants - http://msdn.microsoft.com/en-us/library/bb774096(v=VS.85).aspx
В данном случае:
ssfBITBUCKET = 0x0a
SpangeBoB
12.06.2010, 02:59
В ирк Slip задал вопрос: - Как будет выглядеть преобразование символов в противоположный регистр? Его реализация этой задачи оказалась короче на Perl.Perl выиграл :)
Perl:
perl -e "for(shift =~ /\w/g) { print lc if /\p{IsUpper}/; print uc if /\p{IsLower}/; }" KjbgfYGKHJKHghk
Powershell:
function CaseConvert
{
process {-join ([char[]]$_ | ForEach-Object { if ([char]::islower($_)) {[char]::toUpper($_)} else {[char]::tolower($_)}})}
}
"ПриВет","DeErrQ" | CaseConvert"
Вывод:
пРИвЕТ
dEeRRq
${C:\windows\win.ini} | CaseConvert
Вывод:
; FOR 16-BIT APP SUPPORT
[FONTS]
[EXTENSIONS]
[MCI EXTENSIONS]
[FILES]
[mAIL]
mapi=1
cmcdllname32=MAPI32.DLL
cmc=1
mapix=1
mapixver=1.0.0.1
olemESSAGING=1
[mci eXTENSIONS.bak]
M2V=mpegvIDEO
MOD=mpegvIDEO
А вот ,что удобнее использовать решать уже вам =)
Кстати на Перле вышло в итоге ещё короче:
perl -e "$_ = shift, tr/A-Za-z/a-zA-Z/, print;" QwErTy
Но таки хочется уменьшить ещё:)
NaX[no]rT
12.06.2010, 11:02
2Slip
powershell отлично работает (http://msdn.microsoft.com/en-us/library/az24scfc%28v=VS.71%29.aspx) с .NET. Портировав перловый регэксп - выйдет короче)
SpangeBoB
12.06.2010, 11:08
Кстати на Перле вышло в итоге ещё короче:
perl -e "$_ = shift, tr/A-Za-z/a-zA-Z/, print;" QwErTy
Но таки хочется уменьшить ещё:)
А на сколько уменьшится если на вход подается 3 языка,например:Украинский, усский,Английский?
SpangeBoB
17.06.2010, 01:06
Небольшая заметка,по поводу как получить свой внешний IP,в данном случае воспользуемся сервисом http://www.myip.ru.Регексп,который используется не совсем корректен если парсить ip,но так как ресурс проверяет валидность сам,то этого достаточно.
function Get-ExternalIp
{
$webcl = New-Object System.Net.WebClient
try {
$webcl.DownloadString('http://www.myip.ru/get_ip.php?loc=') -match "\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b" | Out-Null
"Ваш IP-адрес: {0}" -f $matches[0]
}
catch
{
"IP-адрес не удалось получить."
}
}
Ваш IP_адрес: 127.0.0.1
Маленькое дополнение с GUI.Для этого мы воспользуемся PowershellPack,который содержит свыше 1000 всевозможно полезных функций и скриптов.Скачать PowerShellPack и более подробно ознакомиться с его функционалом можно http://code.msdn.microsoft.com/PowerShellPack
Import-Module WPK
New-Label (get-externalip) | show-window
http://img716.imageshack.us/img716/5296/capturelm.png (http://img716.imageshack.us/i/capturelm.png/)
Uploaded with ImageShack.us (http://imageshack.us)
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot