自分用サンプル

##サンプル集
基本拾い物のPowershellサンプルを集めただけの記事です。自分用

##どういう環境で使うか
・自動化をしたい
・OfficeがなくVBAが使えない
・マウスクリック作業が多いサーバ等々


##マウスクリックを実行する
```Powershell
start iexplore.exe

#Set the average time to your system load and open an iexplorer page
Start-Sleep -Seconds 3

[system.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | out-null

# Set the exactly position of cursor in some iexplore hyperlink between the (open parenthesis) below: 
[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(1240,489)

function Click-MouseButton
{
    $signature=@' 
      [DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
      public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
'@ 

    $SendMouseClick = Add-Type -memberDefinition $signature -name "Win32MouseEventNew" -namespace Win32Functions -passThru 

        $SendMouseClick::mouse_event(0x00000002, 0, 0, 0, 0);
        $SendMouseClick::mouse_event(0x00000004, 0, 0, 0, 0);
}

Click-MouseButton
```


##マウスの座標を調べる1
```Powershell
# PowerShellでマウスポインタの座標を取得する

# アセンブリのロード
Add-Type -AssemblyName System.Windows.Forms

# フォームの作成・ボタンの作成
$form = New-Object System.Windows.Forms.Form
$form.Size = "200,200"
$form.StartPosition = "CenterScreen"

$Button = New-Object System.Windows.Forms.Button
$Button.Location = "50,50"
$Button.Size = "100,50"
$Button.Text = "クリック！"

# クリックイベント
$click = {
    for ( $a = 0 ; $a -lt 10 ; $a++ )
    {
        $x = [System.Windows.Forms.Cursor]::Position.X # マウスのX座標
        $y = [System.Windows.Forms.Cursor]::Position.Y # マウスのY座標
        Write-Host "マウスの現在座標は($x,$y)です"
        Start-Sleep(1)
    }
    Write-Host "終わり"
}
$Button.Add_Click($click)

$form.Controls.Add($Button)
$Form.Showdialog()
```



##マウスの座標を調べる2
```Powershell
$provider = New-Object Microsoft.CSharp.CSharpCodeProvider
$params = New-Object System.CodeDom.Compiler.CompilerParameters
$params.GenerateInMemory = $True
$params.TreatWarningsAsErrors = $True
$refs = "System.dll","mscorlib.dll","System.Drawing.dll","System.Windows.Forms.dll"
$params.ReferencedAssemblies.AddRange($refs)

# C Sharp
$txtCode = '
using System;
using System.Drawing;
using System.Windows.Forms;

public class MouseTrace {
	bool cap_stat = false;
	Form f1 = new Form();
	TextBox tb_x = new TextBox();
	TextBox tb_y = new TextBox();
	Button btn1 = new Button();
	Label lbl1 = new Label();
	Color c_on = Color.Green;
	Color c_off = Color.Red;
	System.Timers.Timer tm1 = new System.Timers.Timer(100.0);
	public MouseTrace(){
		Font font1 = new Font("ＭＳ ゴシック",16);
		f1.Text = "Mouse Trace";
		tb_x.Font = font1;
		tb_x.Location = new Point(10,10);
		tb_x.Text = "0";
		tb_x.TextAlign = HorizontalAlignment.Center;
		tb_x.Width = 100;
		tb_y.Font = font1;
		tb_y.Location = new Point(tb_x.Right+10,10);
		tb_y.Text = "0";
		tb_y.TextAlign = HorizontalAlignment.Center;
		tb_y.Width = 100;
		btn1.Location = new Point(10,tb_x.Bottom+10);
		btn1.Text = "Mouse Capture";
		btn1.Width = 110;
		btn1.MouseClick += new MouseEventHandler(btn1_MouseClick);
		lbl1.Location = new Point(btn1.Right+10,btn1.Top);
		lbl1.Text = "Off";
		lbl1.ForeColor = c_off;
		lbl1.Font = font1;
		f1.Size = new System.Drawing.Size(tb_y.Right+30,btn1.Bottom+50);
		f1.Controls.Add(tb_x);
		f1.Controls.Add(tb_y);
		f1.Controls.Add(btn1);
		f1.Controls.Add(lbl1);
		tm1.Elapsed += new System.Timers.ElapsedEventHandler(WriteMousePosition);
	}
	public void Show(){
		f1.ShowDialog();
	}
	private void WriteMousePosition(object source, System.Timers.ElapsedEventArgs e){
		// 画面上の絶対座標
		tb_x.Text = Cursor.Position.X.ToString();
		tb_y.Text = Cursor.Position.Y.ToString();
	}
	private void btn1_MouseClick(object sender, MouseEventArgs e){
		if(cap_stat){
			lbl1.ForeColor = c_off;
			lbl1.Text = "Off";
			cap_stat = false;
			tm1.Stop();
		}else{
			lbl1.ForeColor = c_on;
			lbl1.Text = "On";
			cap_stat = true;
			tm1.Start();
		}
	}
}
'

$results = $provider.CompileAssemblyFromSource($params, $txtCode)
$results.Errors
$mAssembly = $results.CompiledAssembly
$i = $mAssembly.CreateInstance("MouseTrace")
$i.Show()
```


##PowwershellでUI Automationで電卓計算
```Powershell
#REQUIRES -Version 3.0

# This is a simple sample for access the MS UIAutomation in PowerShell. 
# In this sample:
#  1. Load the MS UIA via System.Reflection.Assembly
#  2. Launch the AUT ( calc.exe )
#  3. Find the AutomationElement via the AUT Process Id
#  4. Find buttons via 'ClassName' and 'Name' property
#  5. Click the '1', '+', '1', '=' buttons. 
# At last, we will get '2' in the result of calc App.

# Load MS UIAutomation assemblies
Write-Host "Loading MS UIA assemblies"
[void][System.Reflection.Assembly]::LoadWithPartialName("UIAutomationClient")
[void][System.Reflection.Assembly]::LoadWithPartialName("UIAutomationTypes")
[void][System.Reflection.Assembly]::LoadWithPartialName("UIAutomationProvider")
[void][System.Reflection.Assembly]::LoadWithPartialName("UIAutomationClientsideProviders")


# Register client side provider
Write-Host "Register client-side provider"
$client = [System.Reflection.Assembly]::LoadWithPartialName("UIAutomationClientsideProviders")
[Windows.Automation.ClientSettings]::RegisterClientSideProviderAssembly($client.GetName())

# Launch the AUT ( calc.exe ) & sleep 10 seconds for wait the process start
Write-Host "Launching the AUT"
$autProc =  Start-Process calc -PassThru
Start-Sleep -s 10

# Find the calc Element via the process Id
Write-Host "Searching the AUT Root element"
$rootElement = [Windows.Automation.AutomationElement]::RootElement
$condAUTProc = New-Object Windows.Automation.PropertyCondition([Windows.Automation.AutomationElement]::ProcessIdProperty, $autProc.Id)
$autElement = $rootElement.FindFirst([Windows.Automation.TreeScope]::Children, $condAUTProc)

# Find the buttons '1', '+', '='
Write-Host "Searching the button elements"
$condBtn = New-Object Windows.Automation.PropertyCondition([Windows.Automation.AutomationElement]::ClassNameProperty, "Button")

$condName = New-Object Windows.Automation.PropertyCondition([Windows.Automation.AutomationElement]::NameProperty, "1")
$condTarget = New-Object Windows.Automation.AndCondition($condBtn, $condName)
$btn1Element = $autElement.FindFirst([Windows.Automation.TreeScope]::Descendants, $condTarget)

$condName = New-Object Windows.Automation.PropertyCondition([Windows.Automation.AutomationElement]::NameProperty, "+")
$condTarget = New-Object Windows.Automation.AndCondition($condBtn, $condName)
$btnPlusElement = $autElement.FindFirst([Windows.Automation.TreeScope]::Descendants, $condTarget)

$condName = New-Object Windows.Automation.PropertyCondition([Windows.Automation.AutomationElement]::NameProperty, "=")
$condTarget = New-Object Windows.Automation.AndCondition($condBtn, $condName)
$btnEqualElement = $autElement.FindFirst([Windows.Automation.TreeScope]::Descendants, $condTarget)

# Click the buttons
Write-Host "Clicking the buttons"
$btn1Element.GetCurrentPattern([Windows.Automation.InvokePattern]::Pattern).Invoke()
Start-Sleep -s 1
$btnPlusElement.GetCurrentPattern([Windows.Automation.InvokePattern]::Pattern).Invoke()
Start-Sleep -s 1
$btn1Element.GetCurrentPattern([Windows.Automation.InvokePattern]::Pattern).Invoke()
Start-Sleep -s 1
$btnEqualElement.GetCurrentPattern([Windows.Automation.InvokePattern]::Pattern).Invoke()
Start-Sleep -s 1

Write-Host "Finished. Please check the results on the AUT."
```



##powershellでsendkeys
```powershell
add-type -AssemblyName System.Windows.Forms

#メモ帳を開く
notepad

#500ミリ秒スリープ
start-sleep -Milliseconds 500
#aiueoと入力
[System.Windows.Forms.SendKeys]::SendWait("aiueo")
```