Мне нужно переименовать несколько файлов на моем сервере. Для этого я делаю проект на C# в Visual Studio. (дополнительная информация: этот проект должен делать и другие вещи) Теперь я пытаюсь вызвать командный файл из этого проекта. Этот командный файл должен переименовать файл, используя старое и новое имя файла.
Вот код из командного файла:
@echo off
set FILENAME_OLD = "%~1"
set FILENAME_NEW = "%~nx2"
ren %FILENAME_OLD% %FILENAME_NEW%
set error=%errorlevel%
echo %error%
Это код в моем проекте C#:
process.StartInfo.FileName = location;
process.StartInfo.Arguments = string.Format("\"{0}\" \"{1}\"", oldfilename, newfilename);
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
result = process.StandardOutput.ReadLine();
В результате я всегда получаю 1. Значит, ren не сработали. Что я здесь делаю не так?
Все имена файлов находятся в такой структуре в моем проекте C#: @ "C: \ test \ test \ test.bat"
Обновлено:
Я несколько ближе подошел к решению. Проблема заключалась в том, что я не могу передать двойные кавычки в качестве аргумента. Мне нужны эти двойные кавычки, так как некоторые из моих имен файлов содержат пробелы. Как я могу правильно передать эти имена файлов в этот пакетный файл?
Вам нужно увидеть фактическое сообщение об ошибке, чтобы узнать, что происходит. Никто не может сказать, что не так, из того, что вы опубликовали.
Ваш пакетный сценарий и код C# выглядят нормально. Может быть любое количество проблем, связанных с аргументами, которые вы используете, или с самими файлами.
Ваши имена файлов содержат пробелы? Вам нужны кавычки вокруг имен файлов, только если они содержат пробелы. Я думаю, вам следует использовать одинарные кавычки, а не двойные кавычки.
есть ли у вас соответствующие права пользователя для переименования файла? возможно, попробуйте вызвать свою партию из командной строки с теми же параметрами, которые указаны в вашей программе.
Почему вы хотите воссоздать существующую переменную? % errorlevel% - это уровень ошибок, пусть будет и используйте его. Также установите переменные как "FILENAME_OLD=%~1"
вместо FILENAME_OLD = "%~1"
, затем как if errorlevel 1 echo something...
@MadddinTribleD сценарий также должен использоваться в другом месте, потому что он должен вызываться через ftp для другой части проекта. Что касается второго вопроса, я тестирую его в своих каталогах, поэтому у меня есть права.
@TerryCarmen ошибок нет, просто не выполняет свою работу
@jdweng да, иногда пути содержат пробелы
Вы пробовали одинарные кавычки вместо двойных? Первый и последний символ - это двойные кавычки. Затем заключите фигурные скобки в одинарные кавычки. Попробуйте: "'{0}' '{1}'"
Да, но пакет не принимает одинарные кавычки
Мне удалось решить проблему, на мой взгляд, «грязным» способом:
//I changed newfilename so it's only the filename with extention and not the full path anymore.
string text = "\"" + oldfilename+ "\"" + " " + "\"" + newfilename;
System.IO.File.WriteAllText(@"c:\test\test.txt", text);
process.StartInfo.FileName = location;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
result = process.StandardOutput.ReadLine();
Как видите, я записал аргументы в текстовый файл, поэтому кавычки будут экранированы.
Пакетный файл теперь очень прост:
set /p arguments=<c:\test\test.txt
ren %arguments%
echo %errorlevel%
Я думаю, вам не хватает заключительной цитаты ("\""
) после newfilename
почему бы вам не использовать
System.IO.File.Move()
прямо в C#?