Как изменить каталог с BAT-файлом? - PullRequest
1 голос
/ 10 апреля 2020

Я ожидаю, что приведенный ниже код откроется в каталоге C:\Users\zjafri\Desktop\Arthur\Runner2 при запуске этого bat-файла, но вместо этого он откроется в моем рабочем столе.

У кого-нибудь есть идея, почему?

%windir%\system32\cmd.exe "/K" C:\ProgramData\Anaconda3\Scripts\activate.bat C:\ProgramData\Anaconda3
CD C:\Users\zjafri\Desktop\Arthur\Runner2

Выход консоли:

C:\Users\zjafri\Desktop>C:\windows\system32\cmd.exe "/K" C:\ProgramData\Anaconda3\Scripts\activate.bat C:\ProgramData\Anaconda3

(base) C:\Users\zjafri\Desktop>

Ответы [ 2 ]

2 голосов
/ 10 апреля 2020

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

Пакетный файл - это скрипт. Скрипту нужен исполняемый файл интерпретатора скрипта. Интерпретатор для Windows командных файлов - это Windows командный процессор cmd.exe с полным именем файла %SystemRoot%\System32\cmd.exe или %ComSpec%. SystemRoot и ComSpec - это две предопределенные Windows переменные среды .

Windows Командный процессор останавливает обработку пакетного файла при запуске исполняемого файла до тех пор, пока запущенный исполняемый файл не завершит сам себя. .

Что происходит при обработке экземпляра cmd.exe командного файла следующей командной строкой?

%windir%\system32\cmd.exe "/K" C:\ProgramData\Anaconda3\Scripts\activate.bat C:\ProgramData\Anaconda3

Windows Командный процессор запускает еще один командный процесс для обработки другого командного файла. и из-за опции /K, бесполезно заключенной в двойные кавычки, поддерживает работу после завершения выполнения пакетного файла. Таким образом, запущенный второй экземпляр cmd.exe не завершает себя. По этой причине первый экземпляр cmd.exe ожидает, ждет и ожидает завершения второго экземпляра cmd.exe, прежде чем он продолжит обработку пакетного файла с чтением следующей командной строки.

Следовательно, командная строка CD C:\Users\zjafri\Desktop\Arthur\Runner2 выполняется первым командным процессом, только когда пользователь набрал exit во втором командном процессе, чтобы завершить второй cmd.exe экземпляр.

Одним из решений было бы использование следующих командных строк в командном файле:

call "C:\ProgramData\Anaconda3\Scripts\activate.bat" "C:\ProgramData\Anaconda3"
cd /D "%UserProfile%\Desktop\Arthur\Runner2"

Этот пакетный файл приводит к выполнению пакетного файла activate.bat, затем выполняется команда CD и затем обработка пакетного файла заканчивается.

Что происходит дальше, зависит от о том, как пакетный файл был запущен. Если был сделан двойной щелчок по пакетному файлу, Windows вызывается cmd.exe с использованием неявной опции /C для выполнения пакетного файла, а затем закрыть командный процесс. Поэтому при двойном щелчке командного файла открывается окно консоли, выполняются две командные строки и окно консоли закрывается, когда cmd.exe завершает себя.

Но если пользователь открыл командную строку что означает запуск cmd.exe с использованием неявной опции /K и выполнение командного файла из окна командной строки, введя полное имя файла без или с помощью справки о завершении, нажав один или несколько раз TAB после ввода всего нескольких символов имени папки / файла и нажатия RETURN или ENTER для запуска пакетного файла окно командной строки остается открытым и Anaconda3 * Среда активируется с каталогом %UserProfile%\Desktop\Arthur\Runner2, являющимся текущим каталогом.

Что ж, сначала открыть окно командной строки и вручную запустить командный файл с полным путем не очень удобно. Пакетный файл может быть сохранен с коротким именем файла в одной из папок, путь к которой указан в значении переменной среды PATH, как в каталоге Windows. Это позволило бы открыть командную строку, ввести только имя файла командного файла и нажать клавишу RETURN или ENTER , чтобы выполнить его.

Еще один удобный решением было бы создать на рабочем столе пользователя файл ярлыка (* .lnk) с именем файла Anaconda3, для которого в свойствах ярлыка настроено:

Цель: %SystemRoot%\System32\cmd.exe /K C:\ProgramData\Anaconda3\Scripts\activate.bat C:\ProgramData\Anaconda3
Начало в: C:\Users\zjafri\Desktop\Arthur\Runner2
Комментарий: Opens a command prompt and activates Anaconda3 in Runner2

Существует несколько преимуществ использования файла ярлыка. Сочетание клавиш может быть определено для запуска процессора команд Windows и запуска командного файла для активации среды Anaconda3 независимо от того, какое приложение в данный момент имеет фокус ввода и если рабочий стол находится за Окно приложения или напротив всего остального windows. На вкладках Параметры , Шрифт , Макет , Цвета свойств ярлыка можно определить параметры и внешний вид, которые следует использовать при использовании Anaconda3 , как при использовании окна консоли с большим количеством строк / столбцов и шрифтом большего размера, как по умолчанию.

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

Для такого пакетного файла потребуется всего одна командная строка:

@start "Anaconda3" /D"%UserProfile%\Desktop\Arthur\Runner2" %ComSpec% /K C:\ProgramData\Anaconda3\Scripts\activate.bat C:\ProgramData\Anaconda3

В этом случае cmd.exe обработка пакетного файла с помощью этой командной строки запускает новый командный процесс с параметром /K чтобы сохранить выполнение командного процесса после выполнения командного файла при запуске cmd.exe с Anaconda3 в качестве заголовка для нового окна консоли и wi ая установка перед запуском cmd.exe каталога CD C:\Users\zjafri\Desktop\Arthur\Runner2 в качестве текущего каталога. cmd.exe не ожидает завершения запущенной второй cmd.exe в этом случае, поэтому экземпляр cmd.exe, обрабатывающий пакетный файл с помощью этой единой командной строки, немедленно прекращает работу.

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

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

  • call /?
  • cd /?
  • cmd /?
  • start /?

PS: я не установил ни Anaconda3 , ни прочитал его документацию. Поэтому я не знаю, что происходит при выполнении C:\ProgramData\Anaconda3\Scripts\activate.bat C:\ProgramData\Anaconda3 и каков текущий каталог после выполнения этого командного файла. Если командный файл имеет хорошую кодировку и аргумент C:\ProgramData\Anaconda3 не означает, что текущий каталог будет изменен на этот каталог, тогда все должно работать так, как написано выше. В противном случае предоставляемые решения необходимо адаптировать в зависимости от того, что activate.bat изменяется в среде, то есть когда оно меняет текущий каталог.

0 голосов
/ 10 апреля 2020

выполните команду cd перед командой cmd (объединенной) и оберните все это в блок кода.

(CD C:\Users\zjafri\Desktop\Arthur\Runner2 & cmd.exe /K C:\ProgramData\Anaconda3\Scripts\activate.bat C:\ProgramData\Anaconda3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...