Как переименовать файл в пакетном режиме с помощью процесса в C#

Мне нужно переименовать несколько файлов на моем сервере. Для этого я делаю проект на 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"

Обновлено:

Я несколько ближе подошел к решению. Проблема заключалась в том, что я не могу передать двойные кавычки в качестве аргумента. Мне нужны эти двойные кавычки, так как некоторые из моих имен файлов содержат пробелы. Как я могу правильно передать эти имена файлов в этот пакетный файл?

почему бы вам не использовать System.IO.File.Move() прямо в C#?

MadddinTribleD 13.09.2018 17:24

Вам нужно увидеть фактическое сообщение об ошибке, чтобы узнать, что происходит. Никто не может сказать, что не так, из того, что вы опубликовали.

Terry Carmen 13.09.2018 17:25

Ваш пакетный сценарий и код C# выглядят нормально. Может быть любое количество проблем, связанных с аргументами, которые вы используете, или с самими файлами.

Dan Wilson 13.09.2018 17:26

Ваши имена файлов содержат пробелы? Вам нужны кавычки вокруг имен файлов, только если они содержат пробелы. Я думаю, вам следует использовать одинарные кавычки, а не двойные кавычки.

jdweng 13.09.2018 17:37

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

MadddinTribleD 13.09.2018 17:40

Почему вы хотите воссоздать существующую переменную? % errorlevel% - это уровень ошибок, пусть будет и используйте его. Также установите переменные как "FILENAME_OLD=%~1" вместо FILENAME_OLD = "%~1", затем как if errorlevel 1 echo something...

Gerhard 13.09.2018 19:40

@MadddinTribleD сценарий также должен использоваться в другом месте, потому что он должен вызываться через ftp для другой части проекта. Что касается второго вопроса, я тестирую его в своих каталогах, поэтому у меня есть права.

simon desmet 14.09.2018 09:21

@TerryCarmen ошибок нет, просто не выполняет свою работу

simon desmet 14.09.2018 09:21

@jdweng да, иногда пути содержат пробелы

simon desmet 14.09.2018 09:21

Вы пробовали одинарные кавычки вместо двойных? Первый и последний символ - это двойные кавычки. Затем заключите фигурные скобки в одинарные кавычки. Попробуйте: "'{0}' '{1}'"

jdweng 14.09.2018 10:54

Да, но пакет не принимает одинарные кавычки

simon desmet 14.09.2018 11:18
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
11
148
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

MadddinTribleD 14.09.2018 13:03

Другие вопросы по теме