PDA

View Full Version : سوال: اجراي دستورات داس تو vb6



sina32
دوشنبه 15 شهریور 1389, 20:27 عصر
ميدونم که ميشه دستورات داس رو توي وي‌بی اجرا کرد. کسي راهشو بلده؟

mds_boy
دوشنبه 15 شهریور 1389, 20:33 عصر
دوسته عزیز من بیشتر از api استفاده میکنم، به این شکل :

دستوری به نام winexec هست که میشه با اون هر دستوری رو اجرا کرد.
مثال :
تو قسمته جنرال برنامت این کد api رو بنویس :

Private Declare Function WinExec Lib "kernel32" (ByVal lpCmdLine As String, ByVal nCmdShow As Long) As Long


بعد :

StrDastoor = "Net start mssqlserver "
WinExec StrDastoor, 0
این کد کارش اینه که اس کیو ال سرور رو استارت میکنه، میتونی بجای "Net start mssqlserver" دستوری که میخوای اجرا بشه رو بنویسی !
موفق باشی.

sina32
دوشنبه 15 شهریور 1389, 20:55 عصر
دوسته عزیز من بیشتر از api استفاده میکنم، به این شکل :

دستوری به نام winexec هست که میشه با اون هر دستوری رو اجرا کرد.
مثال :
تو قیمته جنرال برنامت این کد api رو بنویس :

Private Declare Function WinExec Lib "kernel32" (ByVal lpCmdLine As String, ByVal nCmdShow As Long) As Long


بعد :

StrDastoor = "Net start mssqlserver "
WinExec StartSql, 0
این کد کارش اینه که اس کیو ال سرور رو استارت میکنه، میتونی بجای "Net start mssqlserver" دستوری که میخوای اجرا بشه رو بنویسی !
موفق باشی.


دستورات داس! مثلا دستور ساخت پوشه، چطور اجرا ميشه؟

MEhdi Sobhani
دوشنبه 15 شهریور 1389, 21:03 عصر
این طوری :



Dos$="MD MyDir"
Shell "cmd.exe /c " & Dos$

mds_boy
دوشنبه 15 شهریور 1389, 21:15 عصر
میتونی بجای "Net start mssqlserver" از دستوره "MD FolderName" استفاده کنی.
گفتم که داخله این کوتیشن هر دستوری که مستقیم داخله cmd مینویسی رو میتونی بنویسی و اجرا کنی !!!
اگه جواب نداد خبرم کن.
موفق باشی.

با دستوره shell هم میشه هماننده مثاله دوسنه عزیز ولی من اونجوریشو تست نکردم .

sina32
دوشنبه 15 شهریور 1389, 21:19 عصر
جواب داد، مرسی

akbarg64
دوشنبه 15 شهریور 1389, 21:27 عصر
سلام.این سورس رو توی سیستمم پیدا کردم گفتم واست بزارم شاید بدردت بخوره.موفق باشید.

Veteran
پنج شنبه 03 شهریور 1390, 12:22 عصر
گرامی ما وقتی یک کدی رو وارد میکنیم قطعا یک جوابی داره
مثلا توی داس مزنیم dir خود داس یک جوابی به ما میده میخواستم ببینیم چجوری میتونیم اون جواب یا عکس العمل رو در برناممون بگیریم

quiet_programmer
پنج شنبه 03 شهریور 1390, 13:13 عصر
با سلام.


مثلا توی داس مزنیم dir خود داس یک جوابی به ما میده میخواستم ببینیم چجوری میتونیم اون جواب یا عکس العمل رو در برناممون بگیریم

برای این کار میتونین به این شکل عمل کنین:

Shell "cmd.exe /c dir >>" + """" + "d:\new folder\1.txt" + """"

با اجرای این دستور خروجی حاصل از دستور DIR به جای نمایش رو مانیتور میره تو فایل 1.txt داخل فولدر new folder در داخل درایو d. (همونطور که بدیهیه این مسیر میتونه تغییر کنه). بعد شما تو برنامه تون میتونین این فایل رو باز کنین و خروجی دستور اجرا شده در محیط داس رو بخونین.

یا حق.
موفق باشین.

setroyd
پنج شنبه 03 شهریور 1390, 13:21 عصر
این رو نمیتونی انجام بدی چون محیط داس نمایش رو در محیط خودش اجرا میکنه و شما قادر به انجام این کار نیستی ولی میتونی با dir() و یا api findfile استفاده کنی و لیستی از فایلها و پوشها به دست بیاری البته با send message و fso هم میشه .

Veteran
پنج شنبه 03 شهریور 1390, 13:22 عصر
خیلی ممنون اما من میخوام توی خود برنامه به دست بیارم مثلا توی یک تکست باکس
من گفتم مثلا dir ممکنه دستور دیگه ای وارد کنیم

quiet_programmer
پنج شنبه 03 شهریور 1390, 13:31 عصر
این رو نمیتونی انجام بدی چون محیط داس نمایش رو در محیط خودش اجرا میکنه و شما قادر به انجام این کار نیستی ولی میتونی با dir() و یا api findfile استفاده کنی و لیستی از فایلها و پوشها به دست بیاری البته با send message و fso هم میشه .

اول بخون ببین چی میخوان بعد.


مثلا توی داس مزنیم dir خود داس یک جوابی به ما میده میخواستم ببینیم چجوری میتونیم اون جواب یا عکس العمل رو در برناممون بگیریم

به مثلا دقت کن. مثلا برای خروجی که از اجرای یک دستور تو محیط cmd تولید میشه....

نگفته که میخوام دستور dir پیاده سازی کنم یا نگفته که میخوام لیست فایل ها و فولدرهای یک مسیر رو بدست بیارم. وگرنه منم سوادم اونقدری قد میده که بگم عزیزم برای این کار از fso استفاده کن.

یاحق.
موفق باشین.

quiet_programmer
پنج شنبه 03 شهریور 1390, 13:44 عصر
خیلی ممنون اما من میخوام توی خود برنامه به دست بیارم مثلا توی یک تکست باکس

برای این کار خوب فایل رو باز کن و بخون و بریز تو تکست باکس.

مثلا اینجوری:

اول میزنی این دستور اجرا میشه:

Shell "cmd.exe /c dir >>" + """" + "D:\1.txt" + """"

بعد میای با دستور زیر فایل رو باز میکنی و میریزی تو تکست باکس:

Open "d:\1.txt" For Input As #1
Text1.Text = Input(LOF(1), #1)
Close 1


من گفتم مثلا dir ممکنه دستور دیگه ای وارد کنیم

خوب عزیزم این که دیگه نیاز به پرسیدن نداره: به جای DIR دستور مورد نظرت رو بزار. مثلا chkdsk یا del یا چه میدونم هر دستور دیگه که تو محیط cmd تعریف شدست.

یاحق.
موفق باشین

setroyd
پنج شنبه 03 شهریور 1390, 13:52 عصر
Private Sub Command1_Click()
Dim a As String
a = Dir("g:\")
Print a
While a <> ""
a = Dir
Print a
Wend
End Sub
با این کد میتونی سرچ کنی یک مسیر رو .

quiet_programmer
پنج شنبه 03 شهریور 1390, 18:17 عصر
با سلام.

جناب sobhan93 (http://barnamenevis.member.php?160830-sobhan93) در جواب به سوالی که پرسیده بودین(دستور داس داخل یه تکست باکس باشه و اون دستور اجرا بشه) باید بگم که کدتون رو به شکل زیر تغییر بدین.

Shell "cmd.exe /c "+Me.TxtCommand.Text+" >>" + """" + "D:\1.txt" + """"



بعد با دستوری که قبلا گفتم فایل رو باز کنین و محتویش رو بزارین تو یه تکست باکس دیگه.

یا حق.
موفق باشین.

Veteran
جمعه 04 شهریور 1390, 13:17 عصر
راستیش این کد کارو منو راه نمیندازه ! یک کدی چیزی که مستقیم بشه خروجی رو دید اگر باشه خوبه

setroyd
جمعه 04 شهریور 1390, 13:29 عصر
دوست عزیز من اون دستور که گذاشتم dir() کارش همین بود دیگه !!!! مستقیم این کارو میکرد و وابستگی نداشت !برات ضمیمه کردم دانلود کن .

butterfly8528
شنبه 05 شهریور 1390, 18:03 عصر
سلام .
یک Button و یک TextBox بر روی فرم قرار بدید و کد زیر رو داخل فرمتون بریزید و پروژه رو اجرا کنید :
'www.arshamsoft.com

Option Explicit

Private Function ShellCMD(strCmd As String) As String

Dim WshShell As Object, oExec As Object, strOut As String

Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec(strCmd)
strOut = ""
Do While oExec.Status = 0
If Not oExec.StdOut.AtEndOfStream Then
strOut = strOut & oExec.StdOut.Read(1)
End If
DoEvents
Loop

ShellCMD = strOut

Set oExec = Nothing
Set WshShell = Nothing

End Function

Private Sub Command1_Click()
Text1.Text = ShellCMD("ipconfig /all")
End Sub

با استفاده از توابع API هم میشه خروجی CMD رو به صورت مستقیم به دست آورد اما این روش خیلی کوتاه و ساده تر هست .
موفق باشید :لبخندساده:.

xxxxx_xxxxx
شنبه 05 شهریور 1390, 18:19 عصر
http://barnamenevis.org/showthread.php?248606

butterfly8528
شنبه 05 شهریور 1390, 18:59 عصر
سلام .
این هم روش بعدی که از توابع API استفاده شده:
Option Explicit


Private Declare Function CreatePipe Lib "kernel32" (phReadPipe As Long, phWritePipe As Long, lpPipeAttributes As SECURITY_ATTRIBUTES, ByVal nSize As Long) As Long
Private Declare Sub GetStartupInfo Lib "kernel32" Alias "GetStartupInfoA" (lpStartupInfo As STARTUPINFO)
Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As Any, lpThreadAttributes As Any, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Any) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type

Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long
End Type

Private 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 Byte
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type

Private Type OVERLAPPED
ternal As Long
ternalHigh As Long
offset As Long
OffsetHigh As Long
hEvent As Long
End Type

Private Const STARTF_USESHOWWINDOW = &H1
Private Const STARTF_USESTDHANDLES = &H100
Private Const SW_HIDE = 0
Private Const EM_SETSEL = &HB1
Private Const EM_REPLACESEL = &HC2

Sub Redirect(cmdLine As String, objTarget As Object)

Dim I%, t$
Dim pa As SECURITY_ATTRIBUTES
Dim pra As SECURITY_ATTRIBUTES
Dim tra As SECURITY_ATTRIBUTES
Dim pi As PROCESS_INFORMATION
Dim sui As STARTUPINFO
Dim hRead As Long
Dim hWrite As Long
Dim bRead As Long
Dim lpBuffer(1024) As Byte

pa.nLength = Len(pa)
pa.lpSecurityDescriptor = 0
pa.bInheritHandle = True

pra.nLength = Len(pra)
tra.nLength = Len(tra)

If CreatePipe(hRead, hWrite, pa, 0) <> 0 Then
sui.cb = Len(sui)
GetStartupInfo sui
sui.hStdOutput = hWrite
sui.hStdError = hWrite
sui.dwFlags = STARTF_USESHOWWINDOW Or STARTF_USESTDHANDLES
sui.wShowWindow = SW_HIDE
If CreateProcess(vbNullString, cmdLine, pra, tra, True, 0, Null, vbNullString, sui, pi) <> 0 Then
SetWindowText objTarget.hwnd, ""
Do
DoEvents
Erase lpBuffer()
If ReadFile(hRead, lpBuffer(0), 1023, bRead, ByVal 0&) Then
SendMessage objTarget.hwnd, EM_SETSEL, -1, 0
SendMessage objTarget.hwnd, EM_REPLACESEL, False, lpBuffer(0)
DoEvents
Else
Exit Do
End If
CloseHandle hWrite
Loop
CloseHandle hRead
End If
End If

End Sub


Private Sub Command1_Click()
Redirect "ipconfig /all", Text1
End Sub


موفق باشید :لبخندساده:.

Veteran
پنج شنبه 24 شهریور 1390, 16:23 عصر
سلام .
یک Button و یک TextBox بر روی فرم قرار بدید و کد زیر رو داخل فرمتون بریزید و پروژه رو اجرا کنید :
'www.arshamsoft.com

Option Explicit

Private Function ShellCMD(strCmd As String) As String

Dim WshShell As Object, oExec As Object, strOut As String

Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec(strCmd)
strOut = ""
Do While oExec.Status = 0
If Not oExec.StdOut.AtEndOfStream Then
strOut = strOut & oExec.StdOut.Read(1)
End If
DoEvents
Loop

ShellCMD = strOut

Set oExec = Nothing
Set WshShell = Nothing

End Function

Private Sub Command1_Click()
Text1.Text = ShellCMD("ipconfig /all")
End Sub

با استفاده از توابع API هم میشه خروجی CMD رو به صورت مستقیم به دست آورد اما این روش خیلی کوتاه و ساده تر هست .
موفق باشید :لبخندساده:.
با این نمیشه همه دستورات رو اجرا کرد

محسن واژدی
پنج شنبه 24 شهریور 1390, 17:43 عصر
سلام اگر نام را بدون مسیر بنویسند، در صورتیکه فایل با این نام در فولدر ویندوز، سیستم یا مکان های تعیین شده وجود نداشته باشد برنامه خطای Not found میدهد، البته چون دستورتان را ندیده ام نمیتوانم نظر کاملتری بدهم موفق باشید

Veteran
پنج شنبه 24 شهریور 1390, 20:44 عصر
همین کدی که دوست خوبمون گذاشتن خوبه اما
همین تیکه اخرش
Text1.Text = ShellCMD("ipconfig /all")
اگه به جای ip config /all
یک دستور دیگه ای مثل dir بزاریم با ارور مواجه میشیم اگه بشه همه دستورات رو باهاش انجام داد خیلی خوبه چون خروجی رو توی خود برنامه بدون دردسر بهمون میده
فقط اگه بشه موقعی که دستور اجرا میشه اون صفحه سیاه cmd نشون داده نشده دیگه عالی میشه
اما نمیدونم چشه با تشکر

butterfly8528
جمعه 25 شهریور 1390, 01:35 صبح
سلام .
دوست عزیز این دو روش که قرار دادم فقط برای فرمان های خارجی CMD مثل Ping و IpConfig کاربرد دارن و Dir از فرمان های داخلی هست !
موفق باشید :لبخندساده:.

vbhamed
جمعه 25 شهریور 1390, 09:43 صبح
همین کدی که دوست خوبمون گذاشتن خوبه اما
همین تیکه اخرش
Text1.Text = ShellCMD("ipconfig /all")
اگه به جای ip config /all
یک دستور دیگه ای مثل dir بزاریم با ارور مواجه میشیم اگه بشه همه دستورات رو باهاش انجام داد خیلی خوبه چون خروجی رو توی خود برنامه بدون دردسر بهمون میده
فقط اگه بشه موقعی که دستور اجرا میشه اون صفحه سیاه cmd نشون داده نشده دیگه عالی میشه
اما نمیدونم چشه با تشکر


سلام
براي Dir هم مي تونيد بنويسيد
Text1.Text = ShellCMD("cmd /c dir c:\windows\system32")
ضمنا اگر از كدي كه butterfly8528 (http://barnamenevis.member.php?75627-butterfly8528) عزيز در پست شماره 20 گذاشتن استفاده كنيد صفحه سياه cmd هم نشون داده نميشه، ضمن اينكه اون كد عملكرد بهتري هم داره