Bat, .Net и уровни каталогов
Довольно-таки необычный вопрос, который завел меня в тупик. Итак - есть приложение написанное на C++ и есть приложение написанное на .Net 7. Дерево каталогов выглядит так:
Data\Run.bat
Data\Input\
Data\Output\
Data\Win64\Bin\App-C-plus.exe
Data\Win64\Bin\App-Dot-Net.exe
Содержимое .bat выглядит так:
@echo off
Data\Win64\Bin\App-C-plus.exe ..\..\Data\Input -build ..\..\Data\Output
Data\Win64\Bin\App-Dot-Net.exe ..\..\Data\Input -build ..\..\Data\Output
Содержимое приложения на .Net:
static void Main(string[] args)
{
if (args.Length > 0)
{
if (args[1] == "-build")
{
try
{
File.Copy(args[0], args[2], true);
Console.WriteLine($"File copied from {args[0]} to {args[1]}");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
}
Вот мы и подобрались к сути вопроса: - почему данная команда в .bat файле для приложения написанного на .Net работает не так, как ожидалось:
Data\Win64\Bin\App-Dot-Net.exe ..\..\Data\Input -build ..\..\Data\Output
Но если изменить ее вот так:
Data\Win64\Bin\App-Dot-Net.exe Data\Input -build Data\Output
Чтобы получилось вот так:
@echo off
Data\Win64\Bin\App-C-plus.exe ..\..\Data\Input -build ..\..\Data\Output
Data\Win64\Bin\App-Dot-Net.exe Data\Input -build Data\Output
Все отлично работает. Причем команда для приложения написанного на C++ работает исправно. Мы можем спокойно перейти на уровень каталога выше. Я просто не понимаю, почему стандартная команда перехода на каталог выше, работает не так как я этого ожидал. Не то чтобы меня это беспокоит, просто не могу найти на это ответ. То есть приложение инициализирует запуск, как будто непосредственно находится в папке Data.
UPD: Добавил код, но вариант, предложенный товарищем @rotabor гениален, именно что-то такое я и предпологал:
Directory.SetCurrentDirectory(System.Reflection.Assembly.GetExecutingAssembly().Location);
Правда я его еще не протестировал, но думаю что это то, что нужно.
UPD-1: Протестировал, получаю это:
Error: The value cannot be an empty string. (Parameter 'path')
Код выглядит так:
static void Main(string[] args)
{
if (args.Length > 0)
{
if (args.Length == 2)
{
try
{
Directory.SetCurrentDirectory(System.Reflection.Assembly.GetExecutingAssembly().Location);
File.Copy(args[0], args[1], true);
Console.WriteLine($"File copied from {args[0]} to {args[1]}");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
}