2.powershell起動から挨拶
powershellの起動まで
●powershellの場所
windows10を基準に書いておりますが、windows7でも同じく場所にあると思います。
アクセス方法
×86版をクリック
下記で紹介するpowershell iseも同じフォルダ内にあります。
●起動&実行権限変更
下のようなウインドウが開きます。
初期状態では何も出来ない状況のため、
管理者権限での実行し、実行ポリシーの変更が必要となります。
詳細はこちらの方の記事を参考にしてください。
https://www.atmarkit.co.jp/ait/spv/0805/16/news139.html
他の方の記事となります。
実行ポリシーはRemoteSignedがお勧めです。
一旦、powershellを閉じて、管理者権限で起動します
①実行ポリシーの確認
Get-ExecutionPolicy
②実行ポリシーの変更
Set-ExecutionPolicy RemoteSigned
③実行ポリシーの確認
Get-ExecutionPolicy
実行結果
●挨拶
スクリプトをやるときに、共通して行われる第一ステップです。
新しい世界にようこそ!って感じです
管理者権限のpowershellは閉じて、powershellをもう一度起動しましょう
実行ポリシー変更は一度だけですので、次回以降も普通の立ち上げで大丈夫です。
echo "Hello World"
見にくいですが、実行結果です。
●編集ソフトpowershell ise
コードの色分けや、ステップ実行、使い方を教えてくれるソフトです。
基本的にはこちらで作成し、実行はpowershellで行う流れとなります。
3.フォルダ内比較
今回はフォルダ内の比較方法、バックアップ方法を説明します。
私はこれを利用してSDSの管理を行っています。
私の部署では、営業や、企画、研究、製造、物流等の各箇所が入手したSDSを共通ネットワーク上のフォルダにそれぞれ収納し管理しています。これにより誰でも最新版を閲覧できます。一方、製造現場では紙によるファイルを保管しております(この理由としては、pcの数が少ない現場や、紙の方がアクセスしやすい点が挙げられます。古い体質だけどね…)。これより、常に最新版を印刷して保管しておく必要があります。紙ファイルが最新版でないと、社内パトロールで指摘されることになります。
各箇所が共通ネットワークフォルダにSDSを入れた時に、連絡してくれればいいのですが、なかなか難しいです。
そこで、powershellと、同じくwindows標準のタスクスケジューラを使用して、週1回フォルダ内に更新があったか確認するプログラムを作成しました。
●長くなりましたが、以下がプログラムです。
#SDSフォルダの更新確認 #■検索フォルダ $New_path = 'C:\Users\Desktop\1' #■比較フォルダ $Old_path = 'C:\Users\Desktop\2' #検索フォルダ情報取得 $New1 = get-childitem -path $New_path -recurse #比較フォルダ情報取得 $Old1 = get-childitem -path $Old_path -recurse #比較 $compare = compare-object $New1 $Old1 #更新されてたら、テキストファイルを作成 if ([string]::IsNullOrEmpty($compare)) { } else { $Today = (Get-Date).AddDays(0).ToString("yyyyMMdd") $textfilename = "★SDS更新あり_" + "$Today" + ".txt" #■テキスト出力 compare-object $New1 $Old1 | Out-File C:\Users\Desktop\$textfilename #Oldフォルダを現在に更新 robocopy $New_path $Old_path /MIR /XO /NP }
プログラム内の■を自分のフォルダパスに置き換えて下さい。
○フォルダの住所を表すフォルダパスの確認方法
フォルダを開いて、赤枠で確認できます。
●解説
共通ネットワークフォルダと自分のpcのフォルダを比較し、更新されたファイルのみをコピーし、その結果をテキストファイルで出力します。
また、タスクスケジューラの登録方法は以下です。
私は毎週水曜日の休み時間中に起動させています。指定時間になるとpowershellウインドウが突然起動します。
●バックアップ
下記コードでは、更新された分だけフォルダ内をバックアップします。
#■検索フォルダ $New_path = 'C:\Users\Desktop\1' #■比較フォルダ $Old_path = 'C:\Users\Desktop\2' robocopy $New_path $Old_path /MIR /XO /NP
私の会社では共通ネットワークフォルダを全社的にバックアップするシステムを持っていますが、間違って消してしまったファイルを復元してもらうには、申請書の起案が必要で時間がかかります。
このため、課の共通ネットワークフォルダを外付けHDDにバックアップし、課内で対応しています。
バックアップはたくさんある方がいいしね。
5.SAPシステムを動かす2
SAP関連コードの作り方
4章で説明したように座標、アクション(テキスト入力、読み取りやチェックボックスのチェック等)の調べ方を説明します。
実はSAPにはエクセルマクロ記録のように行った操作を記録してくれる機能が付いています!この機能が付いているということは、SAP自体も自動化を推奨していると言えます。
●SAP自動化の手順↓
1
23
45
67
89
エクセルで変換ファイルを作成しましたが、馴れてくると手動で編集する方が楽です。
VBScriptを実行する前にSAP上の設定でスクリプト利用の解除を行います
解除は以下の手順です。
オプションから
アクセシビリティ&スクリプト→スクリプト→赤枠チェックを図のようにする
このVBScriptを実行すると(ダブルクリック)、先ほど行った操作がものすごい速度で再現されます。
VBScriptを編集するとエクセルや様々なソフトと連携出来ますが、現時点ではpowershellの出現、ie11ではデフォルトで無効となっていたりと、マイナーな言語になって言っております。VBScriptにはVBScriptの利点があるので無くなることは無いですが、せっかくなのでVBScriptをpowershellに変換して、作成していきます。
4章で話したように、座標指定、アクションを繰り返していきます。
例
★テキスト入力:CO01で品目コード入力
●VBScript記載
session.findById("wnd[0]/usr/ctxtCAUFVD-MATNR").text = "999999"
$ID = Invoke-Method $session "findById" @("wnd[0]/usr/ctxtCAUFVD-MATNR") Set-Property $ID "Text" @("999999")
★テキスト読み取り
○powershell
$ID = Invoke-Method $session "findById" @("wnd[0]/usr/ctxtCAUFVD-MATNR") $GET = Get-Property $ID "text"
$GETにテキストが収納されます
★ボタンクリック:CO01で構成品目概要をクリック
●VBScript記載
session.findById("wnd[0]/tbar[1]/btn[6]").press
$ID = Invoke-Method $session "findById" @("wnd[0]/tbar[1]/btn[6]") Invoke-Method $ID "press"
★ショートカットキー
●VBScript記載:CO01で構成品目概要をクリックせず、ショートカットキーF6(構成品目概要)を押した場合
session.findById("wnd[0]").sendVKey 6
$ID = Invoke-Method $session "findById" @("wnd[0]") Invoke-Method $ID "sendVKey" @(6)
ちなみにエンターキーはsendVKey 0です。作成しているとよくでて来ます。
なるべくショートカットキーを使用した方がコンピュータ側になります。マウス操作はより人間的な操作となり、今後RPAを作成していく上でコンピュータ側に変換するのに苦労することになります。また、有名なショートカットのctl +Cのように、普段からショートカットを使っている方が業務効率が上がります。
★無視しても動く記載事項
setFocus
caretPosition
4.SAPシステムを動かす
SAPとはSAP社が作成したERPパッケージです。世界的に導入している企業がたくさんあります。
このSAPを使用して、原料購入から製造、検査、出荷まで管理しています。
また、予算作成も行われており、企業にとってはなくてはならないものです。
SAPはVBScriptと呼ばれるコンピュータ言語で動いています。
●VBScriptとは?
powershellと同様にwindows標準の言語です。windowsには、コマンドプロンプト(windows3~)、VBScript(windows98~)、powershell(windows7~)の言語があります。powershellは最も新しいですが、それぞれ特徴があり兄弟みたいな感じです。兄弟なのでpowershellでもSAPを動かすことができます。
●SAPを立ち上げ、ログイン
以下のスクリプトでサーバを指定して立ち上げ、ログインできます。
以下のスクリプト
echo "-----------SAP処理開始----------------" #-Begin----------------------------------------------------------------- #■自分のid、pass $SAPID = ■ $SAPPASS = ■ $Sig = @' [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); '@ #-Add FindWindow function--------------------------------------------- $Win32 = Add-Type -Namespace Win32 -Name Funcs -MemberDefinition $Sig -PassThru #-Set the path to the SAP GUI directory------------------------------- $SAPGUIPath = "C:\Program Files (x86)\SAP\FrontEnd\SAPgui\" #-Set the SAP system ID or the IP address----------------------------- #★サーバを指定(下記の画像参照) $SID = "★" #-Set the instance number of the SAP system--------------------------- $InstanceNo = "00" #-Starts the SAP GUI-------------------------------------------------- $SAPGUI = $SAPGUIPath + "sapgui.exe" & $SAPGUI $SID $InstanceNo While ($Win32::FindWindow("SAP_FRONTEND_SESSION", "SAP") -eq 0) { Start-Sleep -Milliseconds 250 } #-Begin----------------------------------------------------------------- #-Get-Property-------------------------------------------------------- function Get-Property { param([__ComObject] $object, [String] $propertyName) $objectType = [System.Type]::GetType($object) $objectType.InvokeMember($propertyName, "GetProperty", $NULL, $object, $NULL) } #-Set-Property-------------------------------------------------------- function Set-Property { param([__ComObject] $object, [String] $propertyName, $propertyValue) $objectType = [System.Type]::GetType($object) [Void] $objectType.InvokeMember($propertyName, "SetProperty", $NULL, $object, $propertyValue) } #-Invoke-Method------------------------------------------------------- function Invoke-Method { param([__ComObject] $object, [String] $methodName, $methodParameters) $objectType = [System.Type]::GetType($object) $output = $objectType.InvokeMember($methodName, "InvokeMethod", $NULL, $object, $methodParameters) if ( $output ) { $output } } #-Main---------------------------------------------------------------- $SapGuiAuto = [microsoft.visualbasic.Interaction]::GetObject("SAPGUI") $application = Invoke-Method $SapGuiAuto "GetScriptingEngine" $connection = Get-Property $application "Children" @(0) $session = Get-Property $connection "Children" @(0) $ID = Invoke-Method $session "findById" @("wnd[0]/usr/txtRSYST-MANDT") Set-Property $ID "Text" @("010") $ID = Invoke-Method $session "findById" @("wnd[0]/usr/txtRSYST-BNAME") Set-Property $ID "Text" @("$SAPID") $ID = Invoke-Method $session "findById" @("wnd[0]/usr/pwdRSYST-BCODE") Set-Property $ID "Text" @("$SAPPASS") $ID = Invoke-Method $session "findById" @("wnd[0]/usr/txtRSYST-LANGU") Set-Property $ID "Text" @("JA") $ID = Invoke-Method $session "findById" @("wnd[0]") Invoke-Method $ID "sendVKey" @(0)
以上スクリプト
★サーバは各社で異なるため、
以下画像のメッセージサーバ(赤枠内)を参照してください。
SAPコードの解説
①座標指定 $ID = Invoke-Method $session "findById" @("wnd[0]/usr/txtRSYST-BNAME") ②アクション(テキスト入力) Set-Property $ID "Text" @("$SAPID")
SAPコードは上記のように①座標指定、②テキスト入力で1セットになっており、これの繰り返しです。
①座標指定
"wnd[0]/usr/txtRSYST-BNAME"が座標になります。前後のコードは変更せず、この座標部分のみ変更して、作成していきます。尚、この座標の調べ方は5章で説明します。
②アクション
Set-Propertyは直訳すると、特性を決める。つまり、①で指定した座標$IDに"$SAPID"をテキスト形式でセットするとなります。
powershellで無料RPA 【目次】
1.powershellとは?メリット、デメリット
★powershellとは?
windowsに標準搭載しており(Windows 7 以降)、無料で使えます。
つまり今日からRPAを作成できます!
以下でメリットとデメリット、私の感想を…
★メリット
●コスト
RPAの作成ソフトは年間100万円くらいかかります。しかも、ロボットを作成
、使用し続ける限り、年会費なので毎年発生します。
また、会社ではお金をかけるとその分成果を求められ、費用対効果も計算させられます。
一方、powershellは無料!
というか……パソコン購入時に既に払っています。実は使わないと損している!
●windows標準搭載
powershellはmicrosoft社製なので、ワードやエクセルをコントロールしやすい機能があります。
★デメリット
●RPA作成には知識が必要
powershellはコンピュータ言語でコードを作成するため、コンピュータ言語の知識が必要となります。
一方、RPA作成ソフトでは、既にコードで書かれているブロックを繋ぎ合わせて作成していくため、コンピュータ言語を覚える必要はありません。
しかし、より自分にあったRPAを作成するにはコードを勉強し修正しなければなりません。
★感想
プログラミング学習が必須科目となり、今までにはいない、プログラミング当たり前人材が入社してきます。私の世代はパソコン当たり前の世代でエクセル等にはなれていましたが、年の行った人でエクセルに苦戦している人を見ると、非効率なことやってるなーと思ってました(失礼…)。
しかし、自分が年取ったときに、プログラミング当たり前の新人材が来たときに新人材から非効率な仕事をして、無駄金払っていると思われることとなります。
また、子どもにもプログラミング勉強も手助けしていくため必要となります。
単に仕事の自動化のためだけではなく、今後の人生のためにプログラミングを勉強してみようと思い、悪戦苦闘しながらやっています