【急求】VB中调用外部命令scp2实现文件传输

bestdelphier 2009-10-28 01:00:23
大家好,我要写一个小程序,实现vb程序调用scp2来接收文件,现在纠结于到底怎么实现对scp2的调用:

1. 使用shell命令可以实现调用scp2,但是无法获取到返回值,而且执行完shell命令,不会等后台的文件传输完毕,就会继续执行下面的命令行,无法等待文件传输后通过返回值判断是否传输成功。
2. 找到一个javascript的例子,现在vb中也使用wscript来实现调用,但是总是遇到调试问题,具体可以见我另外一个帖子:http://topic.csdn.net/u/20091027/19/24b302aa-069d-44c5-8b69-9ee250838f6a.html

本人以前没写过vb,目前我只想到这两个方法,不知道高手有何建议,或者还有其他的方法可以实现我的要求吗?谢谢大家关注。
...全文
191 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
贝隆 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 of123 的回复:]
执行 Shell 并等待完成的方法有四种:
一、利用是利用 Win32 API 的 FindWindow 函数

    该函数可以搜索指定标题或类的窗口,你可以在调用第一个可执行文件后用FindWindow函数去找指定的窗口,如果找到了,就说明第一个文件还未运行完,等待,直到用FindWindow函数找不到指定窗口,就可以调用第二个文件。这种方法简单,但有个毛病,就是如果满足条件的窗口不只一个,比如用户打开了两个有相同类或标题的窗口(一个是VB程序打开的,而另一个可能是用户自行打开的),那么除非用户关闭这两个窗口,否则VB程序不会继续运行。比如 Wise Install 生成的安装程序就有这个毛病,它在安装过程中可能会用 NotePad 打开 ReadMe 文件,等用户看完 ReadMe 文件关闭窗口后继续安装,但如果用户此时用 NotePad 打开了其他文件,安装程序就会继续等待,因为 FindWindow 函数找到了 NotePad 窗口,可实际上这个窗口跟安装程序毫无关系。

二、利用Windows 95新增加的命令Start。

这个命令可以调用Windows程序,通常用在批文件中。它有一个/w开关,在被调用的程序继续运行结束之前等待。比如,你要调用的三个可执行文件为Command1、Command2和Command3,你可以构造一个批文件如下:
    Start/w Command1
    Start/w Command2
    Start/w Command3
  这个方法可以保证三个按既定顺序运行,但VB程序不能知道什么时候该批文件执行完毕。

三、利用 Windows API 的 OpenProcess 和 CloseHandle 函数来实现对被调用软件的检测

    1) 在 VB 中新建一个标准 EXE 工程;
    2) 在 Form1 中声明 OpenProcess 和 CloseHandle 这两个 Windows API 函数:

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

    3) 然后编写下面的函数:
    Function IsRunning(ByVal ProgramID) As Boolean ' 传入进程标识ID
    Dim hProgram As Long '被检测的程序进程句柄
    hProgram = OpenProcess(0, False, ProgramID)
    If Not hProgram = 0 Then
    IsRunning = True
    Else
    IsRunning = False
    End If
    CloseHandle hProgram
    End Function

    4) 在Form_Click()中加入代码:
    Sub Form_Click()
    Dim X
    Me.Caption = "开始运行"
    X = Shell("NotePad.EXE", 1)
    While IsRunning(X)
    DoEvents
    Wend
    Me.Caption = "结束运行"
    End Sub

四、利用 Win32 API 的 CreateProcess 函数和 WaitForSingleObject 函数来进行这一工作。它的原理比较复杂,在此只介绍如何使用。首先建立一个模块( module),然后输入以下语句:
    Option Explicit
   
    Type STARTUPINFO
    cb As Long
    lpReserved As String
    lpDesktop As String
    lpTitle As String
    dwX As Long
    dwY As Long
    dwXSize As Long
    dwYSize As Long
    dwXCountChars As Long
    dwYCountChars As Long
    dwFillAttribute As Long
    dwFlags As Long
    wShowWindow As Integer
    cbReserved2 As Integer
    lpReserved2 As Long
    hStdInput As Long
    hStdOutput As Long
    hStdError As Long
    End Type

    Type PROCESS_INFORMATION
    hProcess As Long
    hThread As Long
    dwProcessID As Long
    dwThreadID As Long
    End Type

    Global Const NORMAL_PRIORITY_CLASS = &H20&
    Global Const INFINITE = -1&
    Declare Function CloseHandle Lib "kernel32" (hObject As Long) As Boolean
    Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
    Declare Function CreateProcessA Lib "kernel32" ( _
    ByVal lpApplicationName As Long, _
    ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, ByVal _
    lpThreadAttributes As Long, ByVal bInheritHandles As Long, ByVal _
    dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal _
    lpCurrentDirectory As Long, lpStartupInfo As STARTUPINFO, _
    lpProcessInformation As PROCESS_INFORMATION) As Long
   
    Public Sub ShellAndWait(cmdline$)
    Dim NameOfProc As PROCESS_INFORMATION
    Dim NameStart As STARTUPINFO
    Dim X As Long
   
    NameStart.cb = Len(NameStart)
    X = CreateProcessA(0&, cmdline$, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, _
    0&, 0&, NameStart, NameOfProc)
    X = WaitForSingleObject(NameOfProc.hProcess, INFINITE)
    X = CloseHandle(NameOfProc.hProcess)
    End Sub

  建立一个窗体,并放一个命令按钮(Command1)在其上。在 Command1_Click 事件中输入以下内容:
    Private Sub Command1_Click()
    Dim AppToLaunch As String
   
    AppToLaunch = "c:\win95\notepad.exe"
    ShellAndWait AppToLaunch
    End Sub

    运行该程序,按下 Command1,就会调用 NotePad,在 NotePad 运行完毕之前,VB 程序不会继续执行。你可以在程序中使用 ShellAndWait 来代替 Shell 命令。

[/Quote]

牛!本来想说点什么的,看了你的帖子,我还是不说了。。。。
king06 2009-10-28
  • 打赏
  • 举报
回复
顶~
东方之珠 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 of123 的回复:]
执行 Shell 并等待完成的方法有四种:
一、利用是利用 Win32 API 的 FindWindow 函数

    该函数可以搜索指定标题或类的窗口,你可以在调用第一个可执行文件后用FindWindow函数去找指定的窗口,如果找到了,就说明第一个文件还未运行完,等待,直到用FindWindow函数找不到指定窗口,就可以调用第二个文件。这种方法简单,但有个毛病,就是如果满足条件的窗口不只一个,比如用户打开了两个有相同类或标题的窗口(一个是VB程序打开的,而另一个可能是用户自行打开的),那么除非用户关闭这两个窗口,否则VB程序不会继续运行。比如 Wise Install 生成的安装程序就有这个毛病,它在安装过程中可能会用 NotePad 打开 ReadMe 文件,等用户看完 ReadMe 文件关闭窗口后继续安装,但如果用户此时用 NotePad 打开了其他文件,安装程序就会继续等待,因为 FindWindow 函数找到了 NotePad 窗口,可实际上这个窗口跟安装程序毫无关系。

二、利用Windows 95新增加的命令Start。

这个命令可以调用Windows程序,通常用在批文件中。它有一个/w开关,在被调用的程序继续运行结束之前等待。比如,你要调用的三个可执行文件为Command1、Command2和Command3,你可以构造一个批文件如下:
    Start/w Command1
    Start/w Command2
    Start/w Command3
  这个方法可以保证三个按既定顺序运行,但VB程序不能知道什么时候该批文件执行完毕。

三、利用 Windows API 的 OpenProcess 和 CloseHandle 函数来实现对被调用软件的检测

    1) 在 VB 中新建一个标准 EXE 工程;
    2) 在 Form1 中声明 OpenProcess 和 CloseHandle 这两个 Windows API 函数:

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

    3) 然后编写下面的函数:
    Function IsRunning(ByVal ProgramID) As Boolean ' 传入进程标识ID
    Dim hProgram As Long '被检测的程序进程句柄
    hProgram = OpenProcess(0, False, ProgramID)
    If Not hProgram = 0 Then
    IsRunning = True
    Else
    IsRunning = False
    End If
    CloseHandle hProgram
    End Function

    4) 在Form_Click()中加入代码:
    Sub Form_Click()
    Dim X
    Me.Caption = "开始运行"
    X = Shell("NotePad.EXE", 1)
    While IsRunning(X)
    DoEvents
    Wend
    Me.Caption = "结束运行"
    End Sub

四、利用 Win32 API 的 CreateProcess 函数和 WaitForSingleObject 函数来进行这一工作。它的原理比较复杂,在此只介绍如何使用。首先建立一个模块( module),然后输入以下语句:
    Option Explicit
   
    Type STARTUPINFO
    cb As Long
    lpReserved As String
    lpDesktop As String
    lpTitle As String
    dwX As Long
    dwY As Long
    dwXSize As Long
    dwYSize As Long
    dwXCountChars As Long
    dwYCountChars As Long
    dwFillAttribute As Long
    dwFlags As Long
    wShowWindow As Integer
    cbReserved2 As Integer
    lpReserved2 As Long
    hStdInput As Long
    hStdOutput As Long
    hStdError As Long
    End Type

    Type PROCESS_INFORMATION
    hProcess As Long
    hThread As Long
    dwProcessID As Long
    dwThreadID As Long
    End Type

    Global Const NORMAL_PRIORITY_CLASS = &H20&
    Global Const INFINITE = -1&
    Declare Function CloseHandle Lib "kernel32" (hObject As Long) As Boolean
    Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
    Declare Function CreateProcessA Lib "kernel32" ( _
    ByVal lpApplicationName As Long, _
    ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, ByVal _
    lpThreadAttributes As Long, ByVal bInheritHandles As Long, ByVal _
    dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal _
    lpCurrentDirectory As Long, lpStartupInfo As STARTUPINFO, _
    lpProcessInformation As PROCESS_INFORMATION) As Long
   
    Public Sub ShellAndWait(cmdline$)
    Dim NameOfProc As PROCESS_INFORMATION
    Dim NameStart As STARTUPINFO
    Dim X As Long
   
    NameStart.cb = Len(NameStart)
    X = CreateProcessA(0&, cmdline$, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, _
    0&, 0&, NameStart, NameOfProc)
    X = WaitForSingleObject(NameOfProc.hProcess, INFINITE)
    X = CloseHandle(NameOfProc.hProcess)
    End Sub

  建立一个窗体,并放一个命令按钮(Command1)在其上。在 Command1_Click 事件中输入以下内容:
    Private Sub Command1_Click()
    Dim AppToLaunch As String
   
    AppToLaunch = "c:\win95\notepad.exe"
    ShellAndWait AppToLaunch
    End Sub

    运行该程序,按下 Command1,就会调用 NotePad,在 NotePad 运行完毕之前,VB 程序不会继续执行。你可以在程序中使用 ShellAndWait 来代替 Shell 命令。

[/Quote]

顶这个!
jhone99 2009-10-28
  • 打赏
  • 举报
回复
如果要使用wsh

先要通过“工程\引用”菜单项,把“Windows Script Host Object Modle”一项引用到工程中。如果没有,说明没有安装。可通过下面的方法安装:我的电脑→控制面板→添加/删除程序→安装WINDOWS→附件→Windows scripting host→确定。
of123 2009-10-28
  • 打赏
  • 举报
回复
执行 Shell 并等待完成的方法有四种:
一、利用是利用 Win32 API 的 FindWindow 函数

该函数可以搜索指定标题或类的窗口,你可以在调用第一个可执行文件后用FindWindow函数去找指定的窗口,如果找到了,就说明第一个文件还未运行完,等待,直到用FindWindow函数找不到指定窗口,就可以调用第二个文件。这种方法简单,但有个毛病,就是如果满足条件的窗口不只一个,比如用户打开了两个有相同类或标题的窗口(一个是VB程序打开的,而另一个可能是用户自行打开的),那么除非用户关闭这两个窗口,否则VB程序不会继续运行。比如 Wise Install 生成的安装程序就有这个毛病,它在安装过程中可能会用 NotePad 打开 ReadMe 文件,等用户看完 ReadMe 文件关闭窗口后继续安装,但如果用户此时用 NotePad 打开了其他文件,安装程序就会继续等待,因为 FindWindow 函数找到了 NotePad 窗口,可实际上这个窗口跟安装程序毫无关系。

二、利用Windows 95新增加的命令Start。

这个命令可以调用Windows程序,通常用在批文件中。它有一个/w开关,在被调用的程序继续运行结束之前等待。比如,你要调用的三个可执行文件为Command1、Command2和Command3,你可以构造一个批文件如下:
Start/w Command1
Start/w Command2
Start/w Command3
这个方法可以保证三个按既定顺序运行,但VB程序不能知道什么时候该批文件执行完毕。

三、利用 Windows API 的 OpenProcess 和 CloseHandle 函数来实现对被调用软件的检测

1) 在 VB 中新建一个标准 EXE 工程;
2) 在 Form1 中声明 OpenProcess 和 CloseHandle 这两个 Windows API 函数:

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

3) 然后编写下面的函数:
Function IsRunning(ByVal ProgramID) As Boolean ' 传入进程标识ID
Dim hProgram As Long '被检测的程序进程句柄
hProgram = OpenProcess(0, False, ProgramID)
If Not hProgram = 0 Then
IsRunning = True
Else
IsRunning = False
End If
CloseHandle hProgram
End Function

4) 在Form_Click()中加入代码:
Sub Form_Click()
Dim X
Me.Caption = "开始运行"
X = Shell("NotePad.EXE", 1)
While IsRunning(X)
DoEvents
Wend
Me.Caption = "结束运行"
End Sub

四、利用 Win32 API 的 CreateProcess 函数和 WaitForSingleObject 函数来进行这一工作。它的原理比较复杂,在此只介绍如何使用。首先建立一个模块( module),然后输入以下语句:
Option Explicit

Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type

Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long
End Type

Global Const NORMAL_PRIORITY_CLASS = &H20&
Global Const INFINITE = -1&
Declare Function CloseHandle Lib "kernel32" (hObject As Long) As Boolean
Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Declare Function CreateProcessA Lib "kernel32" ( _
ByVal lpApplicationName As Long, _
ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, ByVal _
lpThreadAttributes As Long, ByVal bInheritHandles As Long, ByVal _
dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal _
lpCurrentDirectory As Long, lpStartupInfo As STARTUPINFO, _
lpProcessInformation As PROCESS_INFORMATION) As Long

Public Sub ShellAndWait(cmdline$)
Dim NameOfProc As PROCESS_INFORMATION
Dim NameStart As STARTUPINFO
Dim X As Long

NameStart.cb = Len(NameStart)
X = CreateProcessA(0&, cmdline$, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, _
0&, 0&, NameStart, NameOfProc)
X = WaitForSingleObject(NameOfProc.hProcess, INFINITE)
X = CloseHandle(NameOfProc.hProcess)
End Sub

建立一个窗体,并放一个命令按钮(Command1)在其上。在 Command1_Click 事件中输入以下内容:
Private Sub Command1_Click()
Dim AppToLaunch As String

AppToLaunch = "c:\win95\notepad.exe"
ShellAndWait AppToLaunch
End Sub

运行该程序,按下 Command1,就会调用 NotePad,在 NotePad 运行完毕之前,VB 程序不会继续执行。你可以在程序中使用 ShellAndWait 来代替 Shell 命令。
bestdelphier 2009-10-28
  • 打赏
  • 举报
回复
是的,一定要用scp2传输,有啥办法不?
  • 打赏
  • 举报
回复
一定要用scp2?
Re: 《文件备份与压缩命令》 ---------------------------------------内容提要: 1/6)tar   命令:打包备份/解压打包(将文件或目录的压缩或不解压查看查看)2/6)gzip  命令:压缩或解压文件3/6)zip   命令:打包和压缩文件4/6)unzip 命令:解压zip文件5/6)scp   命令:远程文件复制(全量备份)6/6)rsync 命令:文件同步工具(增量备份)  本人在教学和实战过程发现,即便是有一定运维经验的人,可能已经能够搭建一定复杂度的Linux架构,但是在来来回回的具体操作,还是体现出CLI(命令界面)功底不够扎实,甚至操作的非常‘拙’、处处露‘怯’。 对一个士兵来说,枪就是他的武器,对于一个程序员来说,各种library(工具库)就是他的武器;而对于Linux运维人员来说,无疑命令行工具CLI(命令界面)就是他们的武器;高手和小白之间的差距往往就体现在对于这些“武器”的掌握和熟练程度上。有时候一个参数就能够解决的事情,小白们可能要写一个复杂的Shell脚本才能搞定,这就是对CLI(命令界面)没有理解参悟透彻导致。 研磨每一个命令就是擦拭手的作战武器,平时不保养不理解,等到作战的时候,一定不能够将手的武器发挥到最好,所以我们要平心、静气和专注,甘坐冷板凳一段时间,才能练就一身非凡的内功! 本教程从实战出发,结合当下流行或最新的Linux(v6/7/8 版本)同时演示,将命令行结合到解决企业实战问题来,体现出教学注重实战的务实精神,希望从事或未来从事运维的同学,能够认真仔细的学完Linux核心命令的整套课程。 本课程系列将逐步推出,看看我教学的进度和您学习的步伐,孰占鳌头! 注:关于教学环境搭建,可以参考本人其它课程系列,本教学就不再赘述! 《参透 VMware 桌面级虚拟化》 《在虚拟机安装模版机(包括应用软件等)》 《SecureCRT 连接 GNS3/Linux 的安全精密工具》

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧