PDA

View Full Version : سوال: اجرای فایل‌های دارای پسوند cmd در پروژه vb.net



saeidmobashery
دوشنبه 16 بهمن 1402, 12:31 عصر
سلام و عرض ارادت بر اساتید عزیز
بنده یک فایل cmd دارم که حاوی پیش فرض‌های متنی است و با تغییر آن پیش فرض ها برنامه exe خاصی را هندل می‌کند پروژه‌ای در vb.net ساخته‌ام که محتویات فایل cmd را ویرایش می‌کند ولی نمی‌دانم چطور آن فایل cmd را از داخل پروژه با کلیک بر روی یک دکمه (باتن) اجرا کنم

سپاس از حضور اساتید گرامی در این سایت عالی

ROSTAM2
دوشنبه 16 بهمن 1402, 16:15 عصر
سلام.
بهتره بجای اون فایل cmd دستوراتش رو با تابع shell یا تابع Start از کلاس Process اجرا کنید.

saeidmobashery
دوشنبه 16 بهمن 1402, 16:48 عصر
سلام.
بهتره بجای اون فایل cmd دستوراتش رو با تابع shell یا تابع Start از کلاس Process اجرا کنید.

بلد نیستم دستورات داخل فایل cmd را به تابع shell بدهم کل متن داخلشو با عنوان مای کامنت خوندم دادم به شل ولی موفق نبود

ROSTAM2
دوشنبه 16 بهمن 1402, 18:14 عصر
بلد نیستم دستورات داخل فایل cmd را به تابع shell بدهم کل متن داخلشو با عنوان مای کامنت خوندم دادم به شل ولی موفق نبود
می شه همون cmd رو با shell اجرا کرد

saeidmobashery
دوشنبه 16 بهمن 1402, 19:39 عصر
می شه همون cmd رو با shell اجرا کرد

با چه کدی برادر جان ؟

پرستو پارسایی
دوشنبه 16 بهمن 1402, 20:06 عصر
Private Sub btnRunCMD_Click(sender As Object, e As EventArgs) Handles btnRunCMD.Click
Dim cmdPath As String = "C:\path\to\your\cmd\file.cmd" ' مسیر فایل cmd خود را در اینجا قرار دهید

Dim startInfo As New ProcessStartInfo()
startInfo.FileName = "cmd.exe"
startInfo.Arguments = "/C " & cmdPath ' استفاده از /C برای اجرای دستورات در cmd و بستن آن بعد از اجرا
startInfo.UseShellExecute = False ' تنظیم UseShellExecute به False برای اجرای cmd به صورت مستقیم
startInfo.RedirectStandardOutput = True ' تنظیم RedirectStandardOutput به True برای دریافت خروجی cmd

Dim process As New Process()
process.StartInfo = startInfo
process.Start()

' می توانید خروجی را دریافت کنید و انجام عملیات دیگر روی آن انجام دهید
Dim output As String = process.StandardOutput.ReadToEnd()
' اینجا خروجی را می توانید استفاده کنید یا نمایش دهید
MessageBox.Show(output)
End Sub

saeidmobashery
دوشنبه 16 بهمن 1402, 20:54 عصر
Private Sub btnRunCMD_Click(sender As Object, e As EventArgs) Handles btnRunCMD.Click
Dim cmdPath As String = "C:\path\to\your\cmd\file.cmd" ' مسیر فایل cmd خود را در اینجا قرار دهید

Dim startInfo As New ProcessStartInfo()
startInfo.FileName = "cmd.exe"
startInfo.Arguments = "/C " & cmdPath ' استفاده از /C برای اجرای دستورات در cmd و بستن آن بعد از اجرا
startInfo.UseShellExecute = False ' تنظیم UseShellExecute به False برای اجرای cmd به صورت مستقیم
startInfo.RedirectStandardOutput = True ' تنظیم RedirectStandardOutput به True برای دریافت خروجی cmd

Dim process As New Process()
process.StartInfo = startInfo
process.Start()

' می توانید خروجی را دریافت کنید و انجام عملیات دیگر روی آن انجام دهید
Dim output As String = process.StandardOutput.ReadToEnd()
' اینجا خروجی را می توانید استفاده کنید یا نمایش دهید
MessageBox.Show(output)
End Sub


سلام استاد عزیز و عرض ارادت
دقیق کد شما را پیاده سازی کردم ولی مسیج باکس خالیه و CMD که با اجرای خارج از پروژه فایل تکست خروجی می‌داد هیچ خروجی نشان نداد

ROSTAM2
دوشنبه 16 بهمن 1402, 21:52 عصر
سلام استاد عزیز و عرض ارادت
دقیق کد شما را پیاده سازی کردم ولی مسیج باکس خالیه و CMD که با اجرای خارج از پروژه فایل تکست خروجی می‌داد هیچ خروجی نشان نداد
حالا چرا cmd
دستوراتی ک نوشتی اینجا ارسال کن معادل Vb .net یا Script اون ایجاد بشه...

ROSTAM2
دوشنبه 16 بهمن 1402, 21:56 عصر
با چه کدی برادر جان ؟

Shell function (Visual Basic for Applications) | Microsoft Learn (https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/shell-function)


' Specifying 1 as the second argument opens the application in
' normal size and gives it the focus.
Dim RetVal
RetVal = Shell("C:\WINDOWS\NOTEPAD.EXE", 1) ' Open Notepad.

saeidmobashery
دوشنبه 16 بهمن 1402, 22:18 عصر
حالا چرا cmd
دستوراتی ک نوشتی اینجا ارسال کن معادل Vb .net یا Script اون ایجاد بشه...

چشم برادر و سپاس از پیگیری شما
متن داخل فایل cmd :

@echo off
Exporter.exe "2" "2007-12-15" "2024-03-01" Dollar.txt 1234123454 ali1360

ROSTAM2
دوشنبه 16 بهمن 1402, 22:41 عصر
چشم برادر و سپاس از پیگیری شما
متن داخل فایل cmd :

@echo off
Exporter.exe "2" "2007-12-15" "2024-03-01" Dollar.txt 1234123454 ali1360

این فایل Exporter دقیقا چیه؟

ROSTAM2
دوشنبه 16 بهمن 1402, 22:52 عصر
از پست شاره 6 کدها رو استفاده کن

با این تغییرات

startInfo.FileName = "Exporter.exe"
startInfo.Arguments = "'2' '2007-12-15' '2024-03-01' Dollar.txt 1234123454 ali1360"


ولی اگر فایل Exporter.exe کنار نرم افزار نیست یا باید آدرس دقیق نوشته بشه یا در رجیستری ثبت بشه

saeidmobashery
دوشنبه 16 بهمن 1402, 23:33 عصر
از پست شاره 6 کدها رو استفاده کن

با این تغییرات

startInfo.FileName = "Exporter.exe"
startInfo.Arguments = "'2' '2007-12-15' '2024-03-01' Dollar.txt 1234123454 ali1360"


ولی اگر فایل Exporter.exe کنار نرم افزار نیست یا باید آدرس دقیق نوشته بشه یا در رجیستری ثبت بشه


برادر جان کد زیر را اعمال کردم :



Private Sub RunCMD_Button_Click(sender As Object, e As EventArgs) Handles RunCMD_Button.Click
Dim startInfo As New ProcessStartInfo()
startInfo.FileName = "Exporter.exe"
startInfo.Arguments = "'2' '2007-12-15' '2024-03-01' Dollar.txt 1234123454 ali1360"
startInfo.UseShellExecute = False
startInfo.RedirectStandardOutput = True
Dim process As New Process()
process.StartInfo = startInfo
process.Start()
Dim output As String = process.StandardOutput.ReadToEnd()
MessageBox.Show(output)
End Sub



خطای زیر به دست آمد :
System.ComponentModel.Win32Exception: 'The system cannot find the file specified'

ROSTAM2
سه شنبه 17 بهمن 1402, 06:39 صبح
برادر جان کد زیر را اعمال کردم :



Private Sub RunCMD_Button_Click(sender As Object, e As EventArgs) Handles RunCMD_Button.Click
Dim startInfo As New ProcessStartInfo()
startInfo.FileName = "Exporter.exe"
startInfo.Arguments = "'2' '2007-12-15' '2024-03-01' Dollar.txt 1234123454 ali1360"
startInfo.UseShellExecute = False
startInfo.RedirectStandardOutput = True
Dim process As New Process()
process.StartInfo = startInfo
process.Start()
Dim output As String = process.StandardOutput.ReadToEnd()
MessageBox.Show(output)
End Sub



خطای زیر به دست آمد :
System.ComponentModel.Win32Exception: 'The system cannot find the file specified'

برای FileName آدرس کامل استفاده کن.

saeidmobashery
سه شنبه 17 بهمن 1402, 09:52 صبح
برای FileName آدرس کامل استفاده کن.

مسیج باکس خالیه و CMD که با اجرای خارج از پروژه فایل تکست خروجی می‌داد هیچ خروجی نشان نداد

ROSTAM2
سه شنبه 17 بهمن 1402, 12:40 عصر
مسیج باکس خالیه و CMD که با اجرای خارج از پروژه فایل تکست خروجی می‌داد هیچ خروجی نشان نداد
از ویژگی Run As Administrator استفاده کنید

saeidmobashery
سه شنبه 17 بهمن 1402, 13:36 عصر
از ویژگی Run As Administrator استفاده کنید

بیشتر توضیح بدین ممنون میشم نمی دونم به چه صورتی انجام بدم

پرستو پارسایی
سه شنبه 17 بهمن 1402, 18:54 عصر
Dim processStartInfo As New ProcessStartInfo()
processStartInfo.FileName = "cmd.exe"
processStartInfo.Arguments = "/C @echo off & Exporter.exe ""2"" ""2007-12-15"" ""2024-03-01"" Dollar.txt 1234123454 ali136" ' دستور مورد نظر خود را اینجا قرار دهید
processStartInfo.Verb = "runas" ' تنظیم دسترسی مدیریتی
Process.Start(processStartInfo)
مطمئن شوید که مسیر فایل cmd و همچنین پارامترهای دستور را به درستی وارد کرده‌اید.

saeidmobashery
پنج شنبه 19 بهمن 1402, 20:23 عصر
عرض سلام و احترام خدمت دوستان و اساتید عزیز

بنده موفق شدم cmd را باز کنم و برنامه مد نظرم را با کامنت‌های ورودی مخصوصش به کمک کدهای قبلی مندرج در این تاپیک ران کنم و سپاس از راهنمایی دوستان
اکنون مشکل جدیدی دارم :

پنجره cmd که باز می‌شود را بلد نیستم ببندم
از دستور زیر کمک می‌گیرم ولی گویا زودتر از اینکه پردازش تمام شود cmd را می‌بندد
process.CloseMainWindow()

در واقع به دنبال دستوری هستم که متوجه شود برنامه cmd کارش تمام شده و اگر بسته نشده آن را ببندد
این اگرش خیلی مهم است چون در مواردی نادر پنجره بسته cmd بعد از پایان کار بسته می‌شود

ممنون می‌شوم راهنمایی بفرمایید

پرستو پارسایی
دوشنبه 23 بهمن 1402, 18:39 عصر
هنگام کلیک بر روی دکمه "Start"، یک فرآیند جدید cmd.exe ایجاد می‌شود و دستورات مورد نظر شما اجرا می‌شن. سپس با استفاده از متد WaitForExit()، صبر می‌کنیم تا پردازش کامل بشه و پنجره cmd بسته شود. در صورتی که بخواهید پنجره cmd را در هر زمانی ببندید، می‌توانید از متد Kill() استفاده کنید.

Imports System.Diagnostics


Public Class Form1
Dim cmdProcess As Process


Private Sub StartButton_Click(sender As Object, e As EventArgs) Handles StartButton.Click
cmdProcess = New Process()
Dim startInfo As New ProcessStartInfo("cmd.exe")
cmdProcess.StartInfo = startInfo
cmdProcess.Start()


' اجرای دستورات مورد نظر


' منتظر بمانید تا پردازش کامل شود و پنجره cmd بسته شود
cmdProcess.WaitForExit()
End Sub


Private Sub StopButton_Click(sender As Object, e As EventArgs) Handles StopButton.Click
If cmdProcess IsNot Nothing AndAlso Not cmdProcess.HasExited Then
' بستن پنجره cmd به صورت اجباری (Forcefully)
cmdProcess.Kill()
End If
End Sub
End Class

saeidmobashery
سه شنبه 24 بهمن 1402, 01:47 صبح
هنگام کلیک بر روی دکمه "Start"، یک فرآیند جدید cmd.exe ایجاد می‌شود و دستورات مورد نظر شما اجرا می‌شن. سپس با استفاده از متد WaitForExit()، صبر می‌کنیم تا پردازش کامل بشه و پنجره cmd بسته شود. در صورتی که بخواهید پنجره cmd را در هر زمانی ببندید، می‌توانید از متد Kill() استفاده کنید.

Imports System.Diagnostics


Public Class Form1
Dim cmdProcess As Process


Private Sub StartButton_Click(sender As Object, e As EventArgs) Handles StartButton.Click
cmdProcess = New Process()
Dim startInfo As New ProcessStartInfo("cmd.exe")
cmdProcess.StartInfo = startInfo
cmdProcess.Start()


' اجرای دستورات مورد نظر


' منتظر بمانید تا پردازش کامل شود و پنجره cmd بسته شود
cmdProcess.WaitForExit()
End Sub


Private Sub StopButton_Click(sender As Object, e As EventArgs) Handles StopButton.Click
If cmdProcess IsNot Nothing AndAlso Not cmdProcess.HasExited Then
' بستن پنجره cmd به صورت اجباری (Forcefully)
cmdProcess.Kill()
End If
End Sub
End Class


استاد عزیز کد WaitForExit() را استفاده کردم حالا تا زمانی که cmd بسته نشود عملیات وی بی تکمیل نمی‌شود
cmd پایان پردازش را اعلام می‌کند و برای بسته شدن اینتر نیاز دارد

پرستو پارسایی
چهارشنبه 25 بهمن 1402, 18:27 عصر
Imports System.Diagnostics

Public Class Form1
Dim cmdProcess As Process


Private Sub StartButton_Click(sender As Object, e As EventArgs) Handles StartButton.Click
cmdProcess = New Process()
Dim startInfo As New ProcessStartInfo("cmd.exe")
cmdProcess.StartInfo = startInfo


' اضافه کردن رویداد بسته شدن به Process
AddHandler cmdProcess.Exited, AddressOf cmdProcess_Exited


cmdProcess.Start()
End Sub


Private Sub StopButton_Click(sender As Object, e As EventArgs) Handles StopButton.Click
If cmdProcess IsNot Nothing AndAlso Not cmdProcess.HasExited Then
cmdProcess.Kill()
End If
End Sub


Private Sub cmdProcess_Exited(sender As Object, e As EventArgs)
' عملیات را به پایان برسانید
End Sub
End Class

یک رویداد Exited به Process اضافه کردم. این رویداد هنگامی فراخوانی می‌شود که cmd بسته بشه. شما می‌تونید کدهای مربوط به پایان عملیات را در داخل رویداد cmdProcess_Exited قرار دهید.

saeidmobashery
دوشنبه 30 بهمن 1402, 23:53 عصر
Imports System.Diagnostics

Public Class Form1
Dim cmdProcess As Process


Private Sub StartButton_Click(sender As Object, e As EventArgs) Handles StartButton.Click
cmdProcess = New Process()
Dim startInfo As New ProcessStartInfo("cmd.exe")
cmdProcess.StartInfo = startInfo


' اضافه کردن رویداد بسته شدن به Process
AddHandler cmdProcess.Exited, AddressOf cmdProcess_Exited


cmdProcess.Start()
End Sub


Private Sub StopButton_Click(sender As Object, e As EventArgs) Handles StopButton.Click
If cmdProcess IsNot Nothing AndAlso Not cmdProcess.HasExited Then
cmdProcess.Kill()
End If
End Sub


Private Sub cmdProcess_Exited(sender As Object, e As EventArgs)
' عملیات را به پایان برسانید
End Sub
End Class

یک رویداد Exited به Process اضافه کردم. این رویداد هنگامی فراخوانی می‌شود که cmd بسته بشه. شما می‌تونید کدهای مربوط به پایان عملیات را در داخل رویداد cmdProcess_Exited قرار دهید.


سپاس از زحمات سرکار خانم پارسایی ، بالاخره امشب موفق شدم