Как указать локальный файл со специальными символами в имени или пути, такими как ä, ö, ü в пакетном файле Windows?

На моей машине с Windows у меня есть крошечный скрипт (.bat) для запуска ряда программ, которые я использую для своей обычной работы, таких как Word, Outlook, определенный файл Excel и т. д.

Нерешенная проблема заключается в том, что я не могу указать определенный файл Excel, который хранится в локальной папке, потому что в имени папки есть специальный символ (немецкий u-umlaut, т.е. ü). Что-то типа:

C:\Büroeinrichtung\MyExcelFile.xlsx

В моем сценарии я пытаюсь вызвать это через

Start "" "C:\Büroeinrichtung\MyExcelFile.xlsx"

но при запуске сценария я получаю предупреждение о том, что ü не принимается (где ü заменяется некоторыми еще более причудливыми знаками на экране).

Я могу изменить имя папки, заменив ü на ue или что-то еще, чтобы обойти проблему, но я бы предпочел решение, которое позволяет оставить мои существующие имена папок без изменений.

Не нашел проблему, затронутую в других вопросах здесь.

Есть ли решение?

P.S. Использую Notepad++.

Позднее дополнение: есть дополнительная проблема, которая до сих пор не дает мне покоя (хотя первоначальная проблема решена). Речь идет о подходе к программному изменению кодовой страницы с помощью команды chcp внутри скрипта. см. вопрос здесь


person Christian Geiselmann    schedule 31.05.2017    source источник
comment
Посмотрите на CMD не может читать датские символы, когда я запускаю файл .bat. Это та же проблема с кодировкой текста. Вы написали пакетный файл в Notepad++, используя Windows-1252, но в консоли кодовая страница OEM 850 используется по умолчанию с немецким, установленным в настройках региона и языка Windows. Умляуты имеют разные кодовые значения в OEM 850 по сравнению с Windows-1252.   -  person Mofi    schedule 31.05.2017


Ответы (2)


Проблема в разных кодировках: ANSI и ASCII. Существуют разные решения:

  • Используйте другой редактор с возможностью изменения кодировки.
  • Воспользуйтесь подсказкой и скопируйте Умлаут в свой редактор.
  • Используйте CMD, перейдите в свой каталог и используйте dir /x, чтобы получить короткое имя из Büroeinrichtung и использовать его в своем сценарии DOS.
person Sascha    schedule 31.05.2017
comment
Если cmd подключен к консоли, пакетные файлы декодируются построчно с использованием кодовой страницы консоли. Если вы сохраняете в ANSI, вам придется временно изменить консоль, чтобы использовать кодовую страницу ANSI для рассматриваемой строки через chcp.com [codepage number]. По умолчанию консоль использует кодовую страницу OEM. - person Eryk Sun; 31.05.2017
comment
@eryksun Спасибо. Как я могу узнать, какой номер кодовой страницы я должен установить? И должен ли я был бы отменить это после этого? - person Christian Geiselmann; 31.05.2017
comment
UTF-8 без BOM также является вариантом, но консоль содержит ошибки с кодовой страницей 65001, поэтому я бы поместил все строки, отличные от ASCII, в раздел, который временно переключается на кодовую страницу 65001 для загрузки строк в качестве переменных среды, в в этот момент они Unicode в cmd, а затем переключаются обратно на OEM. - person Eryk Sun; 31.05.2017
comment
Или вернитесь к исходной кодовой странице, которую вы сохранили в переменной среды codepage, например. for /f "tokens=2 delims=:" %%c in ('chcp.com') do @set codepage=%%c. - person Eryk Sun; 31.05.2017
comment
Вот мой окончательный отчет: a) Метод с коротким именем был самым простым в реализации, но несколько неэлегантным. b) Я попытался скопировать ü с экрана cmd, но обнаружил, что не знаю, как это сделать. c) Я провел несколько экспериментов по изменению кодовых страниц с помощью команды chcp в скрипте но столкнулся с другими проблемами d) Решение, которое мне, наконец, понравилось больше всего, заключалось в установке кодировки сценария (написанного в Notepad++) на кодовую страницу, которая используется по умолчанию в окне cmd: OEM-850 ( как стало ясно при вводе chcp в командном окне). - Спасибо всем. Задача решена. - person Christian Geiselmann; 31.05.2017
comment
@ChristianGeiselmann Чтобы скопировать текст из окна консоли в буфер обмена, щелкните правой кнопкой мыши окно консоли, чтобы открыть его контекстное меню, и щелкните левой кнопкой мыши первый пункт меню Отметить. Теперь вы можете сделать прямоугольное выделение указателем мыши или с помощью Shift+клавиш со стрелками. После того, как выбор сделан, нажмите клавишу RETURN или ENTER, чтобы скопировать выделенный текст в буфер обмена. - person Mofi; 31.05.2017
comment
Копирование символа умляут из консоли через буфер обмена в текстовый редактор с графическим интерфейсом не работает, поскольку закодированный символ OEM 850 автоматически преобразуется при вставке из буфера обмена в Windows-1252. Решение заключается в перенаправлении вывода DIR в текстовый файл с кодировкой OEM 850 и открытии этого файла в текстовом редакторе с графическим интерфейсом для копирования умлаута с кодировкой OEM 850 в пакетный файл. - person Mofi; 31.05.2017
comment
@ChristianGeiselmann, но это не лучший вариант для людей, которым приходится работать с несколькими кодовыми страницами или перемещать файлы между системами в разных регионах. Я не знаю, какие проблемы у вас были с сохранением и изменением кодовой страницы, но у меня это работает нормально. Использование UTF-8 (без BOM) позволяет использовать весь спектр Unicode вместо того, чтобы зацикливаться на устаревших кодовых страницах 1980-х годов, которые делают сценарии непереносимыми в разных регионах. - person Eryk Sun; 31.05.2017
comment
@Mofi, даже наполовину приличный редактор программирования позволяет вам установить кодировку файла. Копирование из консоли — это Unicode, а не OEM, и оно вставляется в редактор как Unicode, который затем может кодироваться в OEM или во что угодно при сохранении файла. - person Eryk Sun; 31.05.2017
comment
@erkysun. Я полагаю, это будет скорее тема для отдельного вопроса, но вот вкратце мой опыт попытки программно изменить кодовые страницы в скрипте: Строка 1: chcp 65001 прекрасно сделал свою работу. Строка 2: Запуск C:\... и т. д. заставил окно cmd исчезнуть (сбой?). Я пробовал это шаг за шагом, вставляя pause после каждой строки, но без особого результата (но, конечно, мне пришлось нажать enter после строки 1). - person Christian Geiselmann; 31.05.2017
comment
@eryksun Я не писал, что текст, скопированный из консоли в буфер обмена, закодирован OEM. Я написал, что при вставке в файл с кодировкой Windows-1252 текст вставляется с кодировкой Windows-1252. Я не знаю, в каких форматах буфера обмена Windows копирует выделенный текст в окне консоли в буфер обмена Windows. Это не имеет большого значения. Имеет значение только то, в какой кодировке скопированный текст вставляется из буфера обмена в текстовый файл, открытый в текстовом редакторе. - person Mofi; 31.05.2017
comment
@Mofi, вы сказали, что закодированный символ OEM 850 автоматически преобразуется при вставке из буфера обмена в Windows-1252. Это два утверждения: это символ OEM 850, которым он не является в любое время (экранный буфер консоли — Unicode), и что он преобразуется в ANSI 1252 в редакторе, чего опять же не происходит. Он копируется как Unicode и вставляется как Unicode, предполагая, что мы не используем какой-то редактор Windows 9x из темных веков, который поддерживает только текст ANSI. - person Eryk Sun; 31.05.2017
comment
@ChristianGeiselmann, навскидку, я не знаю, почему это вышло из строя - извините. Вы только начинаете файл Excel. Когда я сказал, что консоль содержит ошибки в UTF-8, я имел в виду запуск внешних консольных программ, которые используют устаревший API ANSI (например, ReadConsoleA). Сам cmd.exe использует Unicode API консоли (например, ReadConsoleW) и использует кодовую страницу консоли только для определения того, как он должен кодировать текст, записываемый в файлы и каналы (если не используется /u), а также для декодирования содержимого пакетных файлов. - person Eryk Sun; 31.05.2017

Ранее предложенное решение не работало в моем случае (т. е. с использованием специальных венгерских символов), но оно дало мне идею:

Я использовал dir /x для записи в файл:

dir <path> /x >>dir.txt

Используя это, я нашел короткое имя папки.

person Atilla    schedule 03.02.2021