RDot

RDot (https://rdot.org/forum/index.php)
-   Windows (https://rdot.org/forum/forumdisplay.php?f=49)
-   -   PowerShell. Советы, методы, итд. (https://rdot.org/forum/showthread.php?t=316)

SpangeBoB 15.07.2010 00:03

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

SpangeBoB 15.07.2010 00:11

Потребовалось в одном из приложений нажать программно '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}')



Nax[no]rT 15.07.2010 02:52

Удобно смотреть права у пользователей 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

SpangeBoB 19.07.2010 16:47

Как создать с помощью скрипта ярлыки на рабочем столе(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 21:58

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

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 03:15

На 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 14:43

Был задан вопрос,как скачать файлы обновления с сайта 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 =)

http://xmages.net/storage/10/1/0/0/e...d/2152ec24.png

SpangeBoB 08.11.2010 21:28

Вопрос из темы https://rdot.org/forum/showthread.php?p=9034 ,как просто решить на PowerShell:
Код:

dir *.jpg | copy -dest {$_.name.substring(11,4).insert(2,".")}

SpangeBoB 27.11.2010 12:02

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

http://s007.radikal.ru/i300/1011/45/8790cfde953a.png

Код:

$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()


dupD0M 31.08.2011 02:32

А дайте пожалста ссылок по этому ремеслу почитать?


Часовой пояс GMT +3, время: 16:39.

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