ラベル PowerShell の投稿を表示しています。 すべての投稿を表示
ラベル PowerShell の投稿を表示しています。 すべての投稿を表示

2021年3月22日月曜日

【メモ】jsonから名前(キー)を取得, json 集計等 |PowerShell

 $ERROR.Clear();

$records=ConvertFrom-Json '

[

{"101":"","102":"12000","103":"12000"},{"101":"","102":"12000","103":"12000"},{"101":"","102":"12000","103":"12000"},

{"101":"","102":"12000","103":"12000"},{"101":"","102":"12000","103":"12000"},{"101":"","102":"12000","103":"12000"},

{"101":"","102":"12000","103":"12000"},{"101":"","102":"12000","103":"12000"},{"101":"","102":"12000","103":"12000","104":999}

]

'

#json 集計等

$sum=$records|Measure-Object -Property "*" -Sum ;


ConvertTo-Json $sum


#jsonから名前(キー)を取得

$records | ForEach-Object{$_| Get-Member -MemberType Properties | Select-Object -ExpandProperty Name}| Sort-Object -Unique

2018年6月3日日曜日

悪用厳禁:別のPCのデスクトップ画面をキャプチャ。|PowerShell

別のPCのデスクトップ画面をキャプチャ。

Windows|PowerShell
Mac OS でも出来なくはない。

ProcessMakerTLの準備。

デスクトップ画面をキャプチャしたいPCに「ProcessMakerTL」を設定。

ProcessMakerTL をダウンロード
download - ProcessMakerTL : https://sites.google.com/site/processmakertl/download

任意の場所に展開。
例: C:\ProcessMakerTL

試用認証キーファイル をダウンロードして ProcessMakerTL.key を ProcessMakerTL.exe と同じ階層に保存。

起動用バッチファイル(*.bat)を作成。
ファイル名:StartProcessMakerTL.bat
内容:
cd /d %~dp0
"ProcessMakerTL.exe" "address=*" "port=8081" "access_token=0123"

ProcessMakerTL.exe と同じ階層に保存。



StartProcessMakerTL.bat をダブルクリックし、ProcessMakerTL.exe を起動。
※起動しない場合は、以下を確認。

以下のようになれば、起動OK.
ProcessMakerTL_Server:1.1.0.0
Fire >
activation:True
Server Started: 0.0.0.0:8081
access_token: presence

ブラウザで http://127.0.0.1:8081/ にアクセスしてみましょう。
Invalid API token と表示されます。access_tokenを設定して、ProcessMakerTLを起動しているので、エラーになりますが、正常に動作しています。


別のPCから動作チェック。
別のPCのブラウザでProcessMakerTLを起動しているPCのIPアドレスを入力してみましょう。
ブラウザで http://192.168.0.9:8081/ にアクセス。
※ProcessMakerTLを起動しているPCのIPアドレスが 192.168.0.9 の場合。
Invalid API token と表示されればOK。

デスクトップ画面をキャプチャするPowerShellを準備。
以下は、デスクトップ画面をキャプチャし、Base64を返すPowerShellのコードです。

Add-Type -AssemblyName System.Windows.Forms ;
Add-Type -AssemblyName  System.Drawing  ;
$rect = [System.windows.forms.Screen]::PrimaryScreen.Bounds;
$bitmap = new-object System.Drawing.Bitmap( $rect.Width, $rect.Height, [System.Drawing.Imaging.PixelFormat]::Format32bppArgb);
$graphics = [System.Drawing.Graphics]::FromImage($bitmap);
$graphics.CopyFromScreen( $rect.X, $rect.Y, 0, 0, $rect.Size, [System.Drawing.CopyPixelOperation]::SourceCopy);
$memStream = New-Object System.IO.MemoryStream;
$bitmap.Save($memStream,[System.Drawing.Imaging.ImageFormat]::Png );
[byte[]]$bytes = $memStream.ToArray();
$result=([convert]::ToBase64String($bytes)).ToString();
Write-Output  $result;

ファイル名:capture_base64.ps1 でProcessMakerTL.exe と同じ階層に保存。

別のPCのブラウザでURLに以下をコピペして実行してみましょう。

http://192.168.0.9:8081/?target=PowerShell&Arguments=iex%20(Get-Content%20capture_base64.ps1%20-Raw)%3B&access_token=0123
※192.168.0.9 は、ProcessMakerTLを起動しているPCのIPアドレスに変更してください。
以下のように BASE64 の文字列が表示されればOK。

別のPCで ProcessMakerTL.exe を起動しているPCの画面を取得してPNGファイルを保存するPowerShellスクリプトを実行。

Windows PowerShell ISE を起動。

以下のスクリプトを実行。

$body=@{};
$body.Add("target","PowerShell");
$body.Add("Arguments","iex (Get-Content capture_base64.ps1 -Raw);");
$body.Add("access_token","0123");
$return=Invoke-RestMethod -Method GET -Uri http://127.0.0.1:8081 -body $body;
$base64= $return;
$dir = 'C:\Users\PCUSER\Desktop\!Temp\capture\'
$filename = Get-Date -Format "yyyy-MMdd-HHmmss"
$bytes = [Convert]::FromBase64String($base64)
[IO.File]::WriteAllBytes($dir+"capture_$filename.png", $bytes)


C:\Users\PCUSER\Desktop\!Temp\capture\ に画像が保存されます。
※$dir = 'C:\Users\PCUSER\Desktop\!Temp\capture\' は、任意の場所に書き換えてください。

ProcessMakerTL.exe をバックグラウンドで起動。
タスクスケジューラでシステム起動時にProcessMakerTL.exe を起動するように設定しておくとProcessMakerTL.exe がバックグラウンドで起動します。

操作:プログラムの開始
プログラム/スクリプト
C:\ProcessMakerTL\ProcessMakerTL.exe
引数の追加
 "address=*" "port=8081" "access_token=0123" "WindowStyle=Hidden"

※引数に "WindowStyle=Hidden" を加えると ProcessMakerTL.exe は、非表示の状態で起動します。


2018年3月8日木曜日

PowerShellでメールを受信|Receive email with PowerShell,OpenPop.NET

<#
OpenPOP.NET code repository http://hpop.sourceforge.net/
OpenPop.NET 日本語情報トップページ - OSDN : https://ja.osdn.net/projects/sfnet_hpop/
#>

Add-Type -Path "C:\OpenPop.NET 2.0.5\binaries\unsigned\OpenPop.dll" ;

$hostname="POP_Server";
$port=110;
$useSsl=$False;
$username="POP_Account";
$password="POP_Password";

$client = New-Object OpenPop.Pop3.Pop3Client

$client.Connect($hostname, $port, $useSsl);
$client.Authenticate($username, $password);

$messageCount = $client.GetMessageCount();
#$client.GetMessageUids();

$Message=$client.GetMessage(1);

$textVersions=$Message.FindAllTextVersions();
$TEXT= New-Object System.Text.StringBuilder;
$HTML= New-Object System.Text.StringBuilder;
foreach ($textVersion in $textVersions)
{
$MediaType=$textVersion.ContentType.MediaType;
$IsAttachment=$textVersion.IsAttachment;
IF($MediaType -eq "text/plain" -And $IsAttachment -eq $False ){
$TEXT.Append($textVersion.GetBodyAsText())| Out-Null;
}elseif($MediaType -eq "text/html" -And $IsAttachment -eq $False){
$HTML.Append($textVersion.GetBodyAsText())| Out-Null;
}
}

$PATH_LIST= New-Object System.Collections.ArrayList;
$attachments=$Message.FindAllAttachments();
 foreach ($attachment in $attachments)
  {
$PATH="C:\Users\USER\Desktop\attachment\" + $attachment.FileName;
  $attachment.Save($PATH);
  $PATH_LIST.Add($PATH)| Out-Null;
}

$Message.Headers.Subject;
$Message.Headers.From.Address;
$Message.Headers.From.DisplayName;
$Message.Headers.To.Address;
$Message.Headers.To.DisplayName;
$Message.Headers.Date;
$Message.Headers.DateSent;
$TEXT.ToString();
$HTML.ToString();
$PATH_LIST;

2017年5月23日火曜日

memo PowerShell Excel

memo
PowerShell
Excel

$excel = New-Object -ComObject Excel.Application;
$excel.Visible = 1;

$file='%FILEPATH%';
$exi=0;
foreach($obj in $excel.Workbooks){
    if($file -eq $obj.FullName){
        $book=$obj;
        $exi=1;
        break;
    }
}

if($exi-eq0){
$book = $excel.Workbooks.Open($file)
}
$sheet = $book.ActiveSheet;

$sheet.Cells( 1, 1 ).PasteSpecial()
$sheet.Rows("1").RowHeight = 40.5
$sheet.Rows("1").WrapText = $True
$sheet.Rows("1").Font.Size = 10
$sheet.Columns("A").ColumnWidth = 11
$sheet.Columns("B").ColumnWidth = 8
$sheet.Columns("C:D").ColumnWidth = 12



$sheet.Cells( 1, 1 ).Select
$book.Save();

try{
$excel.Quit();
} finally {
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) ;
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($book) ;
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($sheet) ;
}

2017年5月14日日曜日

PowerShell から FileMaker ODBC 経由でレコードの値を更新。|FileMaker ODBC|UPDATE|PowerShell

PowerShell から FileMaker ODBC 経由でレコードの値を更新。|FileMaker ODBC|UPDATE|PowerShell


[void][System.Reflection.Assembly]::LoadWithPartialName('System.Data');
$connectionString = 'driver={FileMaker ODBC};server=localhost;database=テスト;uid=admin;pwd=;';

$cmd = "UPDATE `"テスト`" SET`"フィールド1`"='フィールド1の値更新'  WHERE `"key`" = '74194D2E-DEE1-8E44-BFD1-48FF0E88052A' ";

$odbc_con = New-Object System.Data.Odbc.OdbcConnection($connectionString);
$odbc_con.Open();
$odbc_cmd = New-Object System.Data.Odbc.OdbcCommand;
$odbc_cmd.Connection = $odbc_con;
$odbc_cmd.CommandText = $cmd;

$Result = $odbc_cmd.ExecuteNonQuery();

$odbc_cmd.Dispose();
$odbc_con.Close();
$odbc_con.Dispose() ;
$Result;
<#UPDATE、INSERT、および DELETE のステートメントでは、戻り値は、コマンドは、影響を受ける行の数です。#>

PowerShell から FileMaker ODBC 経由で新規レコードを作成。|FileMaker ODBC|INSERT INTO|PowerShell

PowerShell から FileMaker ODBC 経由で新規レコードを作成。|FileMaker ODBC|INSERT INTO|PowerShell


[void][System.Reflection.Assembly]::LoadWithPartialName('System.Data');
$connectionString = 'driver={FileMaker ODBC};server=localhost;database=テスト;uid=admin;pwd=;';
$cmd = "INSERT INTO  `"テスト`" (`"フィールド1`") VALUES('フィールド1の値')";

$odbc_con = New-Object System.Data.Odbc.OdbcConnection($connectionString);
$odbc_con.Open();
$odbc_cmd = New-Object System.Data.Odbc.OdbcCommand;
$odbc_cmd.Connection = $odbc_con;
$odbc_cmd.CommandText = $cmd;

$Result = $odbc_cmd.ExecuteNonQuery();

$odbc_cmd.Dispose();
$odbc_con.Close();
$odbc_con.Dispose() ;
$Result;
<#UPDATE、INSERT、および DELETE のステートメントでは、戻り値は、コマンドは、影響を受ける行の数です。#>

PowerShell から FileMaker ODBC 経由で値を取得。|FileMaker ODBC|SELECT|PowerShell

PowerShell から FileMaker ODBC 経由で値を取得。


[void][System.Reflection.Assembly]::LoadWithPartialName('System.Data');
$connectionString = 'driver={FileMaker ODBC};server=localhost;database={FileMaker_FileName};uid=admin;pwd=;';
$cmd = 'SELECT * FROM {TableName}';

$odbc_con = New-Object System.Data.Odbc.OdbcConnection($connectionString);
$odbc_con.Open();
$odbc_cmd = New-Object System.Data.Odbc.OdbcCommand;
$odbc_cmd.Connection = $odbc_con;
$odbc_cmd.CommandText = $cmd;
$odbcReader = $odbc_cmd.ExecuteReader();
while ($odbcReader.Read()) {
    $odbcReader['{FieldName}'].ToString() + ' ' + $odbcReader['{FieldName}'].ToString()
}

$odbc_cmd.Dispose();
$odbc_con.Close();
$odbc_con.Dispose() ;

PowerShell Word ファイル内の文字列を置換。word/document.xml

Add-Type -AssemblyName "System.IO.Compression.FileSystem";

$FilePath='C:\Users\PCUSER\Desktop\!Temp\tf00002122.docx';

$lookupTable = @{
'{Title}'='タイトル' ;
'{Heading1}'='見出し1' ;
'{Heading2}'='見出し2' ;
'{Heading3}'='見出し3' ;
'{Heading4}'='見出し4' ;
}

<#word/document.xmlを読み込み#>
$archive = [System.IO.Compression.ZipFile]::OpenRead($FilePath);
$objdocument=$archive.Entries | Where-Object{ $_.FullName -eq 'word/document.xml'};

$sr = New-Object System.IO.StreamReader($objdocument.Open(),[Text.Encoding]::GetEncoding("UTF-8"));
$DocXML=$sr.ReadToEnd();
$sr.Close();
$archive.Dispose();

 $lookupTable.GetEnumerator() | ForEach-Object {
     $NewDocXML=$NewDocXML -replace $_.Key , $_.Value;
    }

<#word/document.xmlを削除#>
$archive = [System.IO.Compression.ZipFile]::Open($FilePath,[System.IO.Compression.ZipArchiveMode]::Update);
$objdocument=$archive.Entries | Where-Object{ $_.FullName -eq 'word/document.xml'};
$objdocument.Delete();
<#word/document.xmlを追加#>
$ZipArchiveEntry=$archive.CreateEntry('word/document.xml');

$sw = New-Object System.IO.StreamWriter($ZipArchiveEntry.Open(), [Text.Encoding]::GetEncoding("UTF-8"));
$sw.Write($NewDocXML);
$sw.Close();

$archive.Dispose();