Старый 14.07.2010, 23:03   #1
SpangeBoB
 
Аватар для SpangeBoB
 
Регистрация: 05.07.2010
Сообщений: 49
Репутация: 14
По умолчанию PowerShell. Советы, методы, итд.

В этом разделе будем обсуждать, делиться накопленным опытом по работе с PowerShell.
SpangeBoB вне форума   Ответить с цитированием
Старый 14.07.2010, 23:11   #2
SpangeBoB
 
Аватар для SpangeBoB
 
Регистрация: 05.07.2010
Сообщений: 49
Репутация: 14
По умолчанию

Потребовалось в одном из приложений нажать программно 'Enter'.Да и как пример использования WinApi.
В этом примере по заголовку окна ищем,что нам требуется и определяем handle.Делаем окно активным и с помощью com object Wscript.Shell отправляем уже "Enter".

PHP код:
param ($caption "Windows Scripting Host")

$signature = @"
[DllImport("
user32.dll", EntryPoint="FindWindow", SetLastError = true)]
public static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);
[DllImport("
user32.dll", SetLastError=true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow(IntPtr hWnd);
"
@

$Window Add-Type -memberDefinition $signature -name "Window" -namespace Win32Functions -passThru
$comobject 
= New-Object -com wscript.shell

$hwd 
$Window::FindWindowByCaption([IntPtr]::Zero,$caption)
if (
$hwd)
{
    
$Window::SetForegroundWindow($hwd)
    
$comobject.SendKeys('{Enter}')

SpangeBoB вне форума   Ответить с цитированием
Старый 15.07.2010, 01:52   #3
Nax[no]rT
 
Регистрация: 14.07.2010
Сообщений: 1
Репутация: 1
По умолчанию

Удобно смотреть права у пользователей PublicFolder в виде User / AccessRights / Identity :
PHP код:
Get-MailPublicFolder PublicFolderName Get-PublicFolderClientPermission Select @{Name="User";Expression={$c $_.User.ToString().Split('/');$c[$c.count-1].TOString()}},@{Name="AccessRights";Expression={ [string]$_.AccessRights}},@{Name="Identity";Expression={$_.Identity}} 
Требуется оснастка Microsoft.Exchange.Management.PowerShell.Admin
Nax[no]rT вне форума   Ответить с цитированием
Старый 19.07.2010, 15:47   #4
SpangeBoB
 
Аватар для SpangeBoB
 
Регистрация: 05.07.2010
Сообщений: 49
Репутация: 14
По умолчанию

Как создать с помощью скрипта ярлыки на рабочем столе(Recycle Bin,Computer,Network) ?

Воспользуемся 2 ComObject, Shell.Application и Wscript.Shell. Нам надо определить какой путь для создания надо указывать.Обратимся к http://msdn.microsoft.com/en-us/library/bb774096(v=VS.85).aspx и видим,что за каждой папкой закреплена определенная константа.

Перечислим все папки и их пути:

PHP код:
0..60 Where-Object {$shellcom.namespace($_)} | `
Select-Object @{l="Number";e=
{$_}},@{l="Folder";e={$shellcom.Namespace($_).Title}},@{l="Path";e={$shellcom.Namespace($_).Self.Path}} | `
Format-Table -AutoSize 
Получим вывод:
PHP код:
Number Folder                   Path
------ ------                   ----
     
0 Desktop                  C:\Users\Александр\Desktop
     1 The Internet             
::{871C5380-42A0-1069-A2EA-08002B30309D}
     
2 Programs                 C:\Users\Александр\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
     3 All Control Panel Items  
::{26EE0668-A00A-44D7-9371-BEB064C98683}\0
     4 Printers                 
::{21EC2020-3AEA-1069-A2DD-08002B30309D}\::{2227A280-3AEA-1069-A2DE-08002B30309D
Теперь создадим ярлыки на рабочем столе.

PHP код:
$shellcom = New-Object -ComObject Shell.Application
$wscriptcom 
= New-Object -ComObject Wscript.Shell

foreach ($i in @(10,17,18))
{
    
$shrtk $wscriptcom.CreateShortcut($shellcom.Namespace(0).Self.Path +"\" + $shellcom.Namespace($i).Title + ".lnk")
    
$shrtk.TargetPath = $shellcom.Namespace($i).Self.Path
    
$shrtk.Save()

SpangeBoB вне форума   Ответить с цитированием
Старый 20.07.2010, 20:58   #5
SpangeBoB
 
Аватар для SpangeBoB
 
Регистрация: 05.07.2010
Сообщений: 49
Репутация: 14
По умолчанию

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

1)Нет проверки на ошибки.
2)Нет возможности до качать файл.
3)Не проверяет существование уже созданного объекта на FTP.
4)Нет поддержки прокси.
5)Еще куча всего =)

Запуск:
./Send -local C:\123 -remote test -server ftp.test.ru -username ftp

PHP код:
param ($local="C:\Test",$remote="/",$server="localhost",$username="ftp",$password)

#Создание директории на FTP сервере.
function CreateFolder($newfolder,$parentfolder="")
{
    
$request = [System.Net.FtpWebRequest]::Create("ftp://"+$server+$remote+$parentfolder+$newfolder)
    
$request.Credentials = New-Object System.Net.NetworkCredential([System.String]$username , [System.String]$password)
    
$request.UsePassive $true
    $request
.UseBinary $true
    $request
.KeepAlive $false
    $request
.Method = [System.Net.WebRequestMethods+FTP]::MakeDirectory
    $makeDirectoryResponse 
$request.GetResponse()
}

#Загрузка файла на FTP сервер.
function UploadFiles($file,$pfolder,$destfile)
{
    
$clnt = new-object System.Net.WebClient
    $creds 
$username+":"+$password
    $url 
"ftp://" $creds "@" $server +$remote+$pfolder+"/"+$file
    Write
-Debug "$file ftp://$server/$pfolder"
    
$clnt.UploadFile($url,$destfile)
}

$rootfolder Join-Path (Resolve-Path $local).Path "\"
$folder = (Get-Item $rootfolder).Name
if (
$remote -ne "/") {$remote "/" $remote "/"}

#Создание корневой директории(по умолчанию Test)на FTP сервере.
CreateFolder 
$folder

#Формируем список директорий с последующим созданием на FTP сервере.
Get-ChildItem 
$rootfolder -Recurse | Where-Object {$_.PsIsContainer} | ForEach-Object {
        
$f = $_.fullname -replace [regex]::escape($rootfolder)
        if (
$f -notmatch "\\")
        {
            CreateFolder 
$f ($folder+"/")
        }
        else 
        {
            
$pf = (Split-Path $f) -replace '\\','/'
            
$f = Split-Path $f -Leaf
            CreateFolder 
$f ($folder+"/"+$pf+"/")
        }
}

#Формируем список файлов с последующей загрузкой на FTP.
Get-ChildItem 
$rootfolder -Recurse | Where-Object {!$_.PsIsContainer} | ForEach-Object {
        
$f = $_.fullname -replace [regex]::escape($rootfolder)
        UploadFiles (Split-Path 
$f -Leaf) ($folder + "/" + ((Split-Path $f) -replace '\\','/')+"/") $_.fullname

SpangeBoB вне форума   Ответить с цитированием
Старый 04.08.2010, 02:15   #6
SpangeBoB
 
Аватар для SpangeBoB
 
Регистрация: 05.07.2010
Сообщений: 49
Репутация: 14
По умолчанию

На Antichat, был задан вопрос(http://forum.antichat.ru/thread221378.html):
Цитата:
Всем привет. Такой вопрос, как отпарсить ники к примеру с сайта: http://la2home.com/index.php?name=klanview&clan_name=KingDom
т.е нужно получить в файл ники, ну либо просто как либо скопировать.
Для этого мы создадим небольшую функцию,как для решения задачи,так и для ознакомления.

PHP код:
Function Get-ClanNicks ([string]$clan='KingDom')
{
    
$wc = New-Object System.Net.WebClient
    $wc
.Encoding = [System.Text.Encoding]::UTF8
    $name 
= -split $wc.DownloadString("http://la2home.com/index.php?name=klanview&clan_name=$clan")
    
$name Where-Object {$_ -match "^sortedColumn"} | ForEach-Object { [void]($_ -match "<td>(\w+)</td>");$matches[1]}

Get-ClanNicks -Clan Dark

Цитата:
OTMOPO3KA
MADONNA
Hunter32
NOL
..................
SpangeBoB вне форума   Ответить с цитированием
Старый 11.10.2010, 13:43   #7
SpangeBoB
 
Аватар для SpangeBoB
 
Регистрация: 05.07.2010
Сообщений: 49
Репутация: 14
По умолчанию

Был задан вопрос,как скачать файлы обновления с сайта http://update.optizone.ru/nod32/eset_upd/ ,задача просто решается с помощью PowerShell без посторонних средств.

1)Самый простой вариант воспользуемся классом WebClient и двумя методами DownloadString и DownloadFile
Код:
$url = "http://update.optizone.ru/nod32/eset_upd/"
$dest = "C:\Base"

$wc = New-Object System.Net.WebClient
-split $wc.DownloadString($url) | ? {$_ -match '^href="[^/]'} | % {[void]($_ -match '"(.+)"');$wc.DownloadFile("$url/$($matches[1])","$dest\$($matches[1])")}
2)Здесь воспользуемся модулем BitsTransfer.Список доступных команд модуля можно посмотреть с помощью Get-Command -Module bitstransfer

Код:
$url = "http://update.optizone.ru/nod32/eset_upd/"
$dest = "F:\FTP"

Import-Module bitstransfer
$wc = New-Object System.Net.WebClient
-split $wc.DownloadString($url) | ? {$_ -match '^href="[^/]'} | % {[void]($_ -match '"(.+)"'); Start-BitsTransfer "$url$($matches[1])" -Destination $dest }
3)Суть такая же ,что и в 1 случае,только добавляем 2 события,которые нужны для создания прогресс бара.
Первое событие DownloadFileCompleted и DownloadProgressChanged -

Немного переделал скрипт автора - http://achuebrigens.wordpress.com/2009/08/22/digitales-taz-abo-via-powershell/ ,за что ему большое Спасибо.

Код:
$url = "http://update.optizone.ru/nod32/eset_upd/"
$dest = "C:\Base"
[switch]$ShowProgress=$true

$wc = New-Object System.Net.WebClient
$files = -split $wc.DownloadString($url) | ? {$_ -match '^href="[^/]'} | % {[void]($_ -match '"(.+)"');$matches[1]}

try 
{
	if ($ShowProgress -and $files)
	{
		$files | ForEach-Object {
		$ProgressAction = {
			write-progress -Activity "$_" -Status "Скачивание" -PercentComplete $Eventargs.ProgressPercentage
		}
		Get-EventSubscriber | where { $_.EventName -eq "DownloadProgressChanged"} | foreach-object { unregister-event -SubscriptionID $_.SubscriptionID }
		Register-Objectevent -EventName "DownloadProgressChanged" -InputObject $wc -Action $ProgressAction | Out-Null
		Get-EventSubscriber | where { $_.EventName -eq "DownloadFileCompleted"} | foreach-object { unregister-event -SubscriptionID $_.SubscriptionID }
		Register-ObjectEvent -EventName "DownloadFileCompleted" -InputObject $wc -SourceIdentifier "$_" | Out-Null
		$wc.DownloadFileAsync("$url$_", "$dest\$_")
		wait-event -SourceId "$_" | Out-Null
		remove-event -SourceId "$_"
		}
	}
}

finally
{
    if ($wc)
    {
        $wc.CancelAsync()
    }

    get-eventsubscriber | where { $_.EventName -eq "DownloadProgressChanged"} | foreach-object { unregister-event -SubscriptionID $_.SubscriptionID -whatif:$false -confirm:$false }
    get-eventsubscriber | where { $_.EventName -eq "DownloadFileCompleted"} | foreach-object { unregister-event -SubscriptionID $_.SubscriptionID -whatif:$false -confirm:$false }
}
2 и 3 способ с поддержкой Progress Bar =)

SpangeBoB вне форума   Ответить с цитированием
Старый 08.11.2010, 20:28   #8
SpangeBoB
 
Аватар для SpangeBoB
 
Регистрация: 05.07.2010
Сообщений: 49
Репутация: 14
По умолчанию

Вопрос из темы https://rdot.org/forum/showthread.php?p=9034 ,как просто решить на PowerShell:
Код:
dir *.jpg | copy -dest {$_.name.substring(11,4).insert(2,".")}

Последний раз редактировалось SpangeBoB; 08.11.2010 в 20:47..
SpangeBoB вне форума   Ответить с цитированием
Старый 27.11.2010, 11:02   #9
SpangeBoB
 
Аватар для SpangeBoB
 
Регистрация: 05.07.2010
Сообщений: 49
Репутация: 14
По умолчанию

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



Код:
$code = @' 
using System; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 

namespace Idle 
{ 
   public static class Timer 
   { 
      [DllImport("user32.dll", SetLastError=false)] 
      private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); 

      [StructLayout(LayoutKind.Sequential)] 
      private struct LASTINPUTINFO 
      { 
         public uint cbSize; 
         public int dwTime; 
      } 

      public static DateTime LastInput 
      { 
         get 
         { 
            LASTINPUTINFO lii = new LASTINPUTINFO(); 
            lii.cbSize = (uint)Marshal.SizeOf(typeof(LASTINPUTINFO)); 
            GetLastInputInfo(ref lii); 
            DateTime bootTime = DateTime.Now.AddMilliseconds(-Environment.TickCount); 
            DateTime lastInput = bootTime.AddMilliseconds(lii.dwTime); 
            return lastInput; 
         } 
      } 
      public static TimeSpan IdleTime 
      { 
         get 
         { 
         return DateTime.Now.Subtract(LastInput); 
         } 
      } 
   } 
} 
'@ 

Add-Type $code 
Function UpdateLabel 
{ 
   $label3.Text = [Idle.Timer]::IdleTime 
   $label4.Text = [Idle.Timer]::LastInput.ToString() 
} 

[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null 
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null 


$form1 = New-Object System.Windows.Forms.Form 
$label4 = New-Object System.Windows.Forms.Label 
$label3 = New-Object System.Windows.Forms.Label 
$label2 = New-Object System.Windows.Forms.Label 
$label1 = New-Object System.Windows.Forms.Label 
$timer =  New-Object System.Windows.Forms.Timer 

$timer.Interval=1000 
$timer.Start() 
$timer.add_Tick({Updatelabel}) 

$form1.Text = "Idle Timer" 
$form1.FormBorderStyle  = [System.Windows.Forms.FormBorderStyle]::FixedDialog 
$form1.ClientSize = New-Object System.Drawing.Size(249,79) 


$label4.Size = New-Object System.Drawing.Size(153,23) 
$label4.Font = New-Object System.Drawing.Font("Microsoft Sans Serif",8.25,1,3,0) 
$label4.Location = New-Object System.Drawing.Point(77,44) 
$label4.Text = [Idle.Timer]::LastInput.ToString() 

$form1.Controls.Add($label4) 

$label3.Size = New-Object System.Drawing.Size(153,23) 
$label3.Font = New-Object System.Drawing.Font("Microsoft Sans Serif",8.25,1,3,0) 
$label3.Location = New-Object System.Drawing.Point(77,17) 
$label3.DataBindings.DefaultDataSourceUpdateMode = 0 
$label3.Text = [Idle.Timer]::IdleTime 
$form1.Controls.Add($label3) 


$label2.Size = New-Object System.Drawing.Size(81,23) 
$label2.Text = "Last Input:" 
$label2.Font = New-Object System.Drawing.Font("Microsoft Sans Serif",8.25,0,3,0) 
$label2.Location = New-Object System.Drawing.Point(13,44) 

$form1.Controls.Add($label2) 

$label1.Size =  New-Object System.Drawing.Size(81,19) 
$label1.Text = "Idle Time:" 
$label1.Font = New-Object System.Drawing.Font("Microsoft Sans Serif",8.25,0,3,0) 
$label1.Location = New-Object System.Drawing.Point(13,17) 
$label1.Name = "label1" 
$form1.Controls.Add($label1) 



$form1.ShowDialog()
SpangeBoB вне форума   Ответить с цитированием
Старый 31.08.2011, 01:32   #10
dupD0M
 
Аватар для dupD0M
 
Регистрация: 29.08.2011
Сообщений: 12
Репутация: 1
По умолчанию

А дайте пожалста ссылок по этому ремеслу почитать?
__________________
http://pix.am/npi8.gif
dupD0M вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot