2

以前は毎晩実行していたいくつかのバッチ ファイルの自動化に取り組んでいます。私は現在セットアップを行っていますが、バッチ ファイルを実行するバッチ ファイルとして最初に作成されたため、一部のジョブがいつ、なぜ失敗したのかをログに記録するのは困難です。これらのジョブを C# コンソール アプリケーションまたは vbscript として書き直すことにしました。これを行う際に、1つの大きな問題に直面しています。

バッチ ファイルには次の行があります。

ctrbld warp7.p < y

ctrlbd.exe は、warp7.p というファイルを引数として受け取りますが、開始するには y のキーを押す必要があります。フォルダーには、文字 y を含む y ファイルがあります。私はバッチ ファイルの初心者であり、vbscript または C# コンソール アプリでこのアクションをエミュレートする方法がわかりません。常にキーを押す必要があります。

4

1 に答える 1

1

バッチパイプを使用するか、Sendkeysメソッドを使用して " Y " キーをアクティブなウィンドウ (プロセス) に送信します。

バッチで:

Echo Y|ctrbld.exe warp7.p

バッチ パイプを使用する VBS の場合:

Set Shell = CreateObject("WScript.Shell")
Shell.RUN "CMD /k ""Echo Y|CMD.exe /k Process.exe"""

SendKeys を使用する VBS の場合:

Set Shell = CreateObject("WScript.Shell")
Shell.RUN "CMD.exe /K"
wscript.sleep(500) ' Wait 500 ms for CMD to fully load, change it if you need more time.
Shell.AppActivate "CMD"
Shell.SendKeys "Y"

C# でバッチ パイプを使用する (VB.Net で開発しているため、構文が間違っている可能性があります)

Process.start("CMD.exe", "/K ""Echo Y|CMD /K Process.exe""")

C# で SendKeys を使用(VB.Net で開発しているため、構文が間違っている可能性があります)

Process.start("Process.exe")
Threading.thread.sleep(500) // Wait for process to load
AppActivate(Handle) // Activate the process window passing a Window Handle
SendKeys.Send("Y")

また、おまけとして、以前に書いたこの関数を提供します。オンライン/オフライン コード トランスレータを使用して C# に変換できます。私のコードでは、キーを送信するためにウィンドウをアクティブにする必要はありません (ただし、キーのみであり、特別なものではありません)。キー)。

  • Windows メッセージを使用する VB.NET の場合:

     #Region " SendKeys To App "
    
    ' [ SendKeys To App Function ]
    '
    ' // By Elektro H@cker
    '
    ' Examples :
    ' SendKeys_To_App("notepad.exe", "By Elektro H@cker" & vbCrLf & "... :D")
    
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
    Private Const EM_REPLACESEL = &HC2
    
    Private Function SendKeys_To_App(ByVal App_Name As String, ByVal str As String) As Boolean
        Dim nPadHwnd As Long, ret As Long, EditHwnd As Long
        Dim APP_WindowTitle As String
    
        If App_Name.ToLower.EndsWith(".exe") Then App_Name = App_Name.Substring(0, App_Name.Length - 4) ' Rename APP Name
    
        Dim ProcessArray = Process.GetProcessesByName(App_Name)
        If ProcessArray.Length = 0 Then
            Return False ' App not found
        Else
            APP_WindowTitle = ProcessArray(0).MainWindowTitle ' Set window title of the APP
        End If
    
        nPadHwnd = FindWindow(App_Name, APP_WindowTitle)
    
        If nPadHwnd > 0 Then
            EditHwnd = FindWindowEx(nPadHwnd, 0&, "Edit", vbNullString) ' Find edit window
            If EditHwnd > 0 Then ret = SendMessage(EditHwnd, EM_REPLACESEL, 0&, str) ' Send text to edit window
            Return True  ' Text sended
        Else
            Return False ' Name/Title not found
        End If
    
    End Function
    
    #End Region
    
于 2013-04-25T19:51:41.160 に答える