不要运行BAT文件。有没有办法在VB内部直接运行命令?

解决方案 »

  1.   

    语法Shell(pathname[,windowstyle])Shell 函数的语法含有下面这些命名参数:部分 描述 
    pathname 必要参数。Variant (String),要执行的程序名,以及任何必需的参数或命令行变量,可能还包括目录或文件夹,以及驱动器。 
    Windowstyle 可选参数。Variant (Integer),表示在程序运行时窗口的样式。如果 windowstyle 省略,则程序是以具有焦点的最小化窗口来执行的。 
    windowstyle 命名参数有以下这些值:常量 值 描述 
    vbHide 0 窗口被隐藏,且焦点会移到隐式窗口。 
    VbNormalFocus 1 窗口具有焦点,且会还原到它原来的大小和位置。 
    VbMinimizedFocus 2 窗口会以一个具有焦点的图标来显示。 
    VbMaximizedFocus 3 窗口是一个具有焦点的最大化窗口。 
    VbNormalNoFocus 4 窗口会被还原到最近使用的大小和位置,而当前活动的窗口仍然保持活动。 
    VbMinimizedNoFocus 6 窗口会以一个图标来显示。而当前活动的的窗口仍然保持活动。 Shell "C:\WINNT\System32" + "\mmc.exe" + " " + "C:\WINNT\System32" + "\dfrg.msc", vbNormalFocus
    说明如果 Shell 函数成功地执行了所要执行的文件,则它会返回程序的任务 ID。任务 ID 是一个唯一的数值,用来指明正在运行的程序。如果 Shell 函数不能打开命名的程序,则会产生错误。注意 缺省情况下,Shell 函数是以异步方式来执行其它程序的。也就是说,用 Shell 启动的程序可能还没有完成执行过程,就已经执行到 Shell 函数之后的语句。
      

  2.   

    假如Bat文件是非常危险的。不小心被人运行了怎么办?对了,还有一点。运行命令时。系统给出对话提示(Yes/No)。我们在Bat文件中应该怎么写?
      

  3.   

    shell("c:\windows\cmd.exe /c aaa.bat")
      

  4.   

    WIN98系统:
    echo off
    choice /c:me yes,no
    if errorlevel 2 goto aaa
    if errorlevel 1 goto bbb
    :aaa
    rem..........你的命令
    :bbb
    rem..........你的命令
    ------------------------------------------------------------------
    WIN2000/XP系统:
    echo off
    echo 请按YES或NO(Y|N)?
    set /p aa=
    if %aa%=="Y" goto bbb
    if %aa%=="N" goto ccc
    :bbb
    rem..........你的命令
    :ccc
    rem..........你的命令
      

  5.   

    如果要用vb使用dos命令,还是用bat文件好一些,不然像dir c:\ >c:\a.txt
    这种命令就无法实现了。电脑爱好者2004年19期里,有一篇专门介绍批处理命令的。
      

  6.   

    批处理文件是无格式的文本文件,它包含一条或多条命令。它的文件扩展名为 .bat 或 .cmd。在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们。使用批处理文件(也被称为批处理程序或脚本),可以简化日常或重复性任务。当然我们的这个版本的主要内容是介绍批处理在入侵中一些实际运用,例如我们后面要提到的用批处理文件来给系统打补丁、批量植入后门程序等。下面就开始我们批处理学习之旅吧。   一.简单批处理内部命令简介   1.Echo 命令   打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo 命令将显示当前回显设置。   语法   echo [{on off}] [message]   Sample:@echo off / echo hello world   在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一些命令到特定格式的文件中.这将在以后的例子中体现出来。   2.@ 命令   表示不显示@后面的命令,在入侵过程中(例如使用批处理来格式化敌人的硬盘)自然不能让对方看到你使用的命令啦。   Sample:@echo off   @echo Now initializing the program,please wait a minite...   @format X: /q/u/autoset (format 这个命令是不可以使用/y这个参数的,可喜的是微软留了个autoset这个参数给我们,效果和/y是一样的。)   3.Goto 命令   指定跳转到标签,找到标签后,程序将处理从下一行开始的命令。   语法:goto label (label是参数,指定所要转向的批处理程序中的行。)   Sample:   if {%1}=={} goto noparms   if {%2}=={} goto noparms(如果这里的if、%1、%2你不明白的话,先跳过去,后面会有详细的解释。)   @Rem check parameters if null show usage   :noparms   echo Usage: monitor.bat ServerIP PortNumber   goto end   标签的名字可以随便起,但是最好是有意义的字母啦,字母前加个:用来表示这个字母是标签,goto命令就是根据这个:来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。   4.Rem 命令   注释命令,在C语言中相当与/*--------*/,它并不会被执行,只是起一个注释的作用,便于别人阅读和你自己日后修改。   Rem Message   Sample:@Rem Here is the description.   5.Pause 命令   运行 Pause 命令时,将显示下面的消息:   Press any key to continue . . .   Sample:   @echo off   :begin   copy a:*.* d:\back   echo Please put a new disk into driver A   pause   goto begin   在这个例子中,驱动器 A 中磁盘上的所有文件均复制到d:\back中。显示的注释提示您将另一张磁盘放入驱动器 A 时,pause 命令会使程序挂起,以便您更换磁盘,然后按任意键继续处理。
    6.Call 命令   从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call 命令接受用作调用目标的标签。如果在脚本或批处理文件外使用 Call,它将不会在命令行起作用。   语法   call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]   参数   [Drive:}[Path] FileName   指定要调用的批处理程序的位置和名称。filename 参数必须具有 .bat 或 .cmd 扩展名。   7.start 命令   调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。   入侵常用参数:   MIN 开始时窗口最小化   SEPARATE 在分开的空间内开始 16 位 Windows 程序   HIGH 在 HIGH 优先级类别开始应用程序   REALTIME 在 REALTIME 优先级类别开始应用程序   WAIT 启动应用程序并等候它结束   parameters 这些为传送到命令/程序的参数   执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE 不等应用程序终止就返回命令提示。如果在命令脚本内执行,该新行为则不会发生。   8.choice 命令   choice 使用此命令可以让用户输入一个字符,从而运行不同的命令。使用时应该加/c:参数,c:后应写提示可输入的字符,之间无空格。它的返回码为1234……   如: choice /c:dme defrag,mem,end   将显示   defrag,mem,end[D,M,E]?   Sample:   Sample.bat的内容如下:   @echo off   choice /c:dme defrag,mem,end   if errorlevel 3 goto defrag (应先判断数值最高的错误码)   if errorlevel 2 goto mem   if errotlevel 1 goto end   :defrag   c:\dos\defrag   goto end   :mem   mem   goto end   :end   echo good bye   此文件运行后,将显示 defrag,mem,end[D,M,E]? 用户可选择d m e ,然后if语句将作出判断,d表示执行标号为defrag的程序段,m表示执行标号为mem的程序段,e表示执行标号为end的程序段,每个程序段最后都以goto end将程序跳到end标号处,然后程序将显示good bye,文件结束。   9.If 命令   if 表示将判断是否符合规定的条件,从而决定执行不同的命令。 有三种格式:   1、if "参数" == "字符串"  待执行的命令   参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号)   如if "%1"=="a" format a:   if {%1}=={} goto noparms   if {%2}=={} goto noparms   2、if exist 文件名  待执行的命令   如果有指定的文件,则条件成立,运行命令,否则运行下一句。   如if exist config.sys edit config.sys   3、if errorlevel / if not errorlevel 数字  待执行的命令   如果返回码等于指定的数字,则条件成立,运行命令,否则运行下一句。   如if errorlevel 2 goto x2     DOS程序运行时都会返回一个数字给DOS,称为错误码errorlevel或称返回码,常见的返回码为0、1。 
     
    10.for 命令   for 命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令。   在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable   for {%variable %%variable} in (set) do command [ CommandLineOptions]   %variable 指定一个单一字母可替换的参数。   (set) 指定一个或一组文件。可以使用通配符。   command 指定对每个文件执行的命令。   command-parameters 为特定命令指定参数或命令行开关。   在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable   而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I   如果命令扩展名被启用,下列额外的 FOR 命令格式会受到   支持:   FOR /D %variable IN (set) DO command [command-parameters]   如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。   FOR /R [[drive:]path] %variable IN (set) DO command [command-   检查以 [drive:]path 为根的目录树,指向每个目录中的FOR 语句。如果在 /R 后没有指定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。   FOR /L %variable IN (start,step,end) DO command [command-para   该集表示以增量形式从开始到结束的一个数字序列。   因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生   序列 (5 4 3 2 1)。   FOR /F ["options"] %variable IN (file-set) DO command   FOR /F ["options"] %variable IN ("string") DO command   FOR /F ["options"] %variable IN (command) DO command   或者,如果有 usebackq 选项:   FOR /F ["options"] %variable IN (file-set) DO command   FOR /F ["options"] %variable IN ("string") DO command   FOR /F ["options"] %variable IN (command) DO command   filenameset 为一个或多个文件名。继续到 filenameset 中的   下一个文件之前,每份文件都已被打开、读取并经过处理。   处理包括读取文件,将其分成一行行的文字,然后将每行   解析成零或更多的符号。然后用已找到的符号字符串变量值   调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开   的第一个空白符号。跳过空白行。您可通过指定可选 "options"   参数替代默认解析操作。这个带引号的字符串包括一个或多个   指定不同解析选项的关键字。这些关键字为:   eol=c - 指一个行注释字符的结尾(就一个)   skip=n - 指在文件开始时忽略的行数。   delims=xxx - 指分隔符集。这个替换了空格和跳格键的   默认分隔符集。   tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代   的 for 本身。这会导致额外变量名称的   格式为一个范围。通过 nth 符号指定 m   符号字符串中的最后一个字符星号,   那么额外的变量将在最后一个符号解析之   分配并接受行的保留文本。   usebackq - 指定新语法已在下类情况中使用:   在作为命令执行一个后引号的字符串并且引号字符为文字字符串命令并允许在 fi中使用双引号扩起文件名称。 
      

  7.   

    控件:textbox1               '发送命令
          textbox2               '接收信息
          commandbutton          '发送按钮
    ’模块Public Declare Function CreatePipe Lib "kernel32" ( _
        phReadPipe As Long, _
        phWritePipe As Long, _
        lpPipeAttributes As Any, _
        ByVal nSize As Long) As Long
    Public Declare Function ReadFile Lib "kernel32" ( _
        ByVal hFile As Long, _
        ByVal lpBuffer As String, _
        ByVal nNumberOfBytesToRead As Long, _
        lpNumberOfBytesRead As Long, _
        ByVal lpOverlapped As Any) As Long
    Public Declare Function WriteFile Lib "kernel32" ( _
        ByVal hFile As Long, _
        lpBuffer As Any, _
        ByVal nNumberOfBytesToWrite As Long, _
        lpNumberOfBytesWritten As Long, _
        ByVal lpOverlapped As Any) As Long
    Public Declare Function PeekNamedPipe Lib "kernel32" ( _
        ByVal hNamedPipe As Long, lpBuffer As Any, _
        ByVal nBufferSize As Long, lpBytesRead As Long, _
        lpTotalBytesAvail As Long, lpBytesLeftThisMessage As Long) As Long
    Public Declare Function CreateProcessA Lib "kernel32" (ByVal _
        lpApplicationName As Long, ByVal lpCommandLine As String, _
        lpProcessAttributes As Any, lpThreadAttributes As Any, _
        ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
        ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, _
        lpStartupInfo As Any, lpProcessInformation As Any) As Long
    Public Declare Function CloseHandle Lib "kernel32" ( _
        ByVal hObject As Long) As Long
    Public Type SECURITY_ATTRIBUTES
        nLength As Long
        lpSecurityDescriptor As Long
        bInheritHandle As Long
    End Type
    Public Type STARTUPINFO
        cb As Long
        lpReserved As Long
        lpDesktop As Long
        lpTitle As Long
        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
    Public Type PROCESS_INFORMATION
        hProcess As Long
        hThread As Long
        dwProcessId As Long
        dwThreadID As Long
    End Type
    Public Const NORMAL_PRIORITY_CLASS = &H20&
    Public Const STARTF_USESTDHANDLES = &H100&
    Public Const STARTF_USESHOWWINDOW = &H1
    Public Const SW_HIDE = 0
    '----------------------------------------------------------------------------------
    'form
    Private Sub Command1_Click()
    Dim retVal As Long
    Dim OurReadPipe As Long
    Dim AppWritePipe As Long
    Dim sa As SECURITY_ATTRIBUTES
    Dim startInfo As STARTUPINFO
    Dim procInfo As PROCESS_INFORMATION
    sa.bInheritHandle = True
    sa.nLength = Len(sa)
    retVal = CreatePipe(OurReadPipe, AppWritePipe, sa, 0)
    If retVal = 0 Then MsgBox "不能创建!"
    startInfo.cb = Len(startInfo)
    startInfo.dwFlags = STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW
    startInfo.wShowWindow = SW_HIDE
    startInfo.hStdOutput = AppWritePipe
    startInfo.hStdError = AppWritePipe
    retVal = CreateProcessA(0&, Text1.Text, _
                            sa, sa, True, NORMAL_PRIORITY_CLASS, _
                            0&, 0&, startInfo, procInfo)
    If retVal = 0 Then MsgBox "不能发送命令!"
    CloseHandle AppWritePipe
    Dim tmpRead As String * 256
    Dim readData As String
    Dim bytesRead As Long
    Do
        retVal = ReadFile(OurReadPipe, tmpRead, 256, bytesRead, 0&)
        readData = readData & Left(tmpRead, bytesRead)
        DoEvents
    Loop While retVal > 0
    Me.Text2.Text = readData
    End Sub
      

  8.   

    //如果要用vb使用dos命令,还是用bat文件好一些,不然像dir c:\ >c:\a.txt这种命令就无法实现了。怎么没法实现,可以啊
    Private Sub Command1_Click()
    Shell "cmd.exe /c dir c:\ >c:\a.txt"
    End Sub
      

  9.   

    Shell "Command.com /C attrib  " & NewFile1 & "    -r -s -h ", vbHide
    setattr "c:\a.ini",vbReadOnly=False