2014-12-06 2 views
2

Почему «1.bat» не может успешно работать? Любая помощь будет оценена. «1.bat» был создан успешно. Он может работать без ошибок, но не может переименовывать файлы.Как написать файл «* .bat»?

private void button1_Click(object sender, EventArgs e) 
    { 

     string str = System.Environment.CurrentDirectory; 
     str += "\\1.bat"; 
     string txt = ""; 
     txt = "ren *.mp3 *.wav"; 

     StreamWriter sw = new StreamWriter(str,false, Encoding.UTF8); 
     sw.Write(txt); 
     sw.Close(); 

     Process p = new Process(); 
     p.StartInfo.FileName = str; 
     p.StartInfo.Arguments = ""; 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
     p.Start();   
    } 
+3

Что вы подразумеваете под _can't run successfully_? Любое сообщение об исключении или ошибке? –

+0

Похож на '\\ 0.bat', а не' 0.bat'. '\\ 0' является символом NULL и недействителен в этом контексте. –

+0

Попробуйте установить UseShellExecute в StartInfo. Но вам не нужно вызывать в .bat для массового переименования файлов! Вы можете легко скопировать код на C#. (Вероятно, вы также не должны предполагать, что у вас есть доступ на запись к текущему каталогу, и есть теоретическая атака, если злоумышленник может изменить файл bat между вами, написав его и выполнив его: они могут заставить вас запускать произвольные команды в качестве пользователя .) – Rup

ответ

5

Одна из проблем заключается в том, что ваш файл записывается с помощью спецификации UTF-8. Попробуйте пройти Encoding.Default, чтобы проверить это. Или передать new UTF8Encoding(false) в качестве кодировки для передачи кодировки UTF-8, которая опускает спецификацию.

Другая проблема (которую вы только что добавили в редактировании) заключается в том, что вы установили UseShellExecute в false. Для этого требуется, чтобы файл, который вы передали, был исполняемым файлом. У вашего файла нет. Вам нужно UseShellExecute быть true, чтобы разрешить оболочке работать, как обрабатывать файл .bat.

И еще одна возможная проблема заключается в том, что текущий каталог может быть не таким, каким вы его считаете.

При столкновении с такими проблемами нет необходимости вообще быть беспомощными. Сделайте некоторые отладки. Добавьте pause в конец вашего командного файла и убедитесь, что вы видите консоль. Вы сразу узнаете, в чем проблема. Изучение того, как отлаживать, так же важно, как и обучение программированию. Вы не сможете сделать последнее, пока не сможете сделать первое.

Если бы я того, чтобы сделать это таким образом, с внешним процессом, я бы:

  • Установите UseShellExecute в false.
  • Провод cmd.exe в качестве исполняемого файла.
  • Передайте команду, которая будет выполнена в командной строке.

Однако было бы гораздо проще сделать это напрямую, используя C#, и, таким образом, избегать поворота внешних процессов.

+0

Вы правы! Большое спасибо :) –

Смежные вопросы