RPA初心者による無料でRPA

RPAやIOTに関するブログ …時々富士山

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
    }

プログラム内の■を自分のフォルダパスに置き換えて下さい。
○フォルダの住所を表すフォルダパスの確認方法
フォルダを開いて、赤枠で確認できます。
f:id:hero32:20200220081534j:plain

●解説
共通ネットワークフォルダと自分のpcのフォルダを比較し、更新されたファイルのみをコピーし、その結果をテキストファイルで出力します。


また、タスクスケジューラの登録方法は以下です。

f:id:hero32:20200309183549j:plain

私は毎週水曜日の休み時間中に起動させています。指定時間になると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
f:id:hero32:20200225074824j:plain
45
f:id:hero32:20200225074906j:plain
67
f:id:hero32:20200225075624j:plain
89
f:id:hero32:20200225074950j:plain

エクセルで変換ファイルを作成しましたが、馴れてくると手動で編集する方が楽です。

VBScriptを実行する前にSAP上の設定でスクリプト利用の解除を行います
解除は以下の手順です。

オプションから
f:id:hero32:20200313073744j:plain
アクセシビリティ&スクリプトスクリプト→赤枠チェックを図のようにする
f:id:hero32:20200313073811j:plain

このVBScriptを実行すると(ダブルクリック)、先ほど行った操作がものすごい速度で再現されます。
VBScriptを編集するとエクセルや様々なソフトと連携出来ますが、現時点ではpowershellの出現、ie11ではデフォルトで無効となっていたりと、マイナーな言語になって言っております。VBScriptにはVBScriptの利点があるので無くなることは無いですが、せっかくなのでVBScriptpowershellに変換して、作成していきます。

4章で話したように、座標指定、アクションを繰り返していきます。


★テキスト入力:CO01で品目コード入力
VBScript記載

session.findById("wnd[0]/usr/ctxtCAUFVD-MATNR").text = "999999"

powershell

$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

powershell

    $ID = Invoke-Method $session "findById" @("wnd[0]/tbar[1]/btn[6]")
    Invoke-Method $ID "press"   

★ショートカットキー
VBScript記載:CO01で構成品目概要をクリックせず、ショートカットキーF6(構成品目概要)を押した場合

session.findById("wnd[0]").sendVKey 6

powershell

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

以上スクリプト

★サーバは各社で異なるため、
以下画像のメッセージサーバ(赤枠内)を参照してください。
f:id:hero32:20200218071712p:plain


SAPコードの解説

①座標指定
$ID = Invoke-Method $session "findById" @("wnd[0]/usr/txtRSYST-BNAME")
②アクション(テキスト入力)
Set-Property $ID "Text" @("$SAPID")

SAPコードは上記のように①座標指定、②テキスト入力で1セットになっており、これの繰り返しです。

①座標指定
"wnd[0]/usr/txtRSYST-BNAME"が座標になります。前後のコードは変更せず、この座標部分のみ変更して、作成していきます。尚、この座標の調べ方は5章で説明します。

f:id:hero32:20200219073758j:plain

②アクション
Set-Propertyは直訳すると、特性を決める。つまり、①で指定した座標$IDに"$SAPID"をテキスト形式でセットするとなります。

powershellで無料RPA 【目次】

私は化学系製造業に勤めており、
powershellを用いた無料のRPA事例を紹介します。


1.powershellとは?メリット、デメリット

2.powershell起動から挨拶

3.フォルダ内比較

4.SAPシステムを動かす

5.SAPシステムを動かす2

6.SAP CO01

7.SAP MIGO製造実績入力 (作成中)

8.SAP CO11N, MSC2N, QA01(作成中)

9.





にほんブログ村 IT技術ブログへ
にほんブログ村

1.powershellとは?メリット、デメリット

powershellとは?

windowsに標準搭載しており(Windows 7 以降)、無料で使えます。
つまり今日からRPAを作成できます!

以下でメリットとデメリット、私の感想を…

★メリット
●コスト
RPAの作成ソフトは年間100万円くらいかかります。しかも、ロボットを作成
、使用し続ける限り、年会費なので毎年発生します。
また、会社ではお金をかけるとその分成果を求められ、費用対効果も計算させられます。

一方、powershellは無料!
というか……パソコン購入時に既に払っています。実は使わないと損している!

windows標準搭載
powershellmicrosoft社製なので、ワードやエクセルをコントロールしやすい機能があります。

★デメリット
●RPA作成には知識が必要
powershellはコンピュータ言語でコードを作成するため、コンピュータ言語の知識が必要となります。
一方、RPA作成ソフトでは、既にコードで書かれているブロックを繋ぎ合わせて作成していくため、コンピュータ言語を覚える必要はありません。
しかし、より自分にあったRPAを作成するにはコードを勉強し修正しなければなりません。

★感想
プログラミング学習が必須科目となり、今までにはいない、プログラミング当たり前人材が入社してきます。私の世代はパソコン当たり前の世代でエクセル等にはなれていましたが、年の行った人でエクセルに苦戦している人を見ると、非効率なことやってるなーと思ってました(失礼…)。
しかし、自分が年取ったときに、プログラミング当たり前の新人材が来たときに新人材から非効率な仕事をして、無駄金払っていると思われることとなります。
また、子どもにもプログラミング勉強も手助けしていくため必要となります。
単に仕事の自動化のためだけではなく、今後の人生のためにプログラミングを勉強してみようと思い、悪戦苦闘しながらやっています