1

Тема: CMD/BAT: Поведение команды DIR

Доброго дня.

Имеем тестовый каталог с 2 файлами "102.xls", "102.xlsx"

c:\_!>dir *.xls
...cut
10.2020  16:37            62 976 102.xls
10.07.2020  16:37            62 976 102.xlsx
...cut

Мне не нужен файл xlsx, как обойти сие поведение?
--------------------------------------------------------------------------------------------
Провожу тест. В каталоге 4 файла:
01.01.doc
0101.doc
01.01.xls
0101.xls

и батник:

cmd.cmd
for /R %%f in (*.doc) do copy "%%f" "%%fx"
for /R %%f in (*.xls) do copy "%%f" "%%fx"

Запускаем, получаем:
0101.doc
0101.docx

01.01.doc
01.01.docx
01.01.docxx

0101.xls
0101.xlsx

01.01.xls
01.01.xlsx
01.01.xlsxx

Во дела, из-за точки в имени файла возникает какая то фигня.

Но удивило другое.

Мне понадобилось сконвертировать множество файлов из xls в xlsx и doc в docx. Казалось бы все просто, простой батник:

for /R %%f in (*.xls) do "C:\Program Files\Microsoft Office\Office16\excelcnv.exe" -oice "%%f" "%%fx"
for /R %%f in (*.doc) do "C:\Program Files\Microsoft Office\Office16\Wordconv.exe" -oice -nme "%%f" "%%fx"

Запускаем в каталоге с теми же файлами
01.01.doc
0101.doc
01.01.xls
0101.xls

Результат:
0101.doc
0101.docx

01.01.doc
01.01.docx

0101.xls
0101.xlsx

01.01.xls
01.01.xlsx
01.01.xlsxx

С doc-ми все в норме.

Я в недоумении.
Помогайте пожалуйста.

Нас невозможно сбить с пути, нам пофигу куда идти.

2

Re: CMD/BAT: Поведение команды DIR

С doc-ми все в норме.

Неожиданно во всех смыслах. На моей системе одинаково неправильное поведение:


u:\_!>dir /b *.doc
x.doc
x.docx

u:\_!>dir /b *.xls
x.xls
x.xlsx

u:\_!>for /r %f in ( *.doc ) do @( echo:%f )
u:\_!\x.doc
u:\_!\x.docx

u:\_!>for /r %f in ( *.xls ) do @( echo:%f )
u:\_!\x.xls
u:\_!\x.xlsx
( 2 * b ) || ! ( 2 * b )

3 (изменено: DnsIs, 2020-11-07 07:43:12)

Re: CMD/BAT: Поведение команды DIR

Я догадываюсь, что это проблема времен DOS с именами 8.3, но какого черта?

Rumata, вы обратили внимание, что творят утилиты:

0101.doc + wordconv.exe = 0101.docx
01.01.doc + wordconv.exe = 01.01.docx

0101.xls + excelcnv.exe = 0101.xlsx
01.01.xls + excelcnv.exe = 01.01.xlsx + 01.01.xlsxx
Нас невозможно сбить с пути, нам пофигу куда идти.

4

Re: CMD/BAT: Поведение команды DIR

Нашел выходы:
1. Порнуха:

dir *.xls* | findstr /vrix "[0-9].*\.xls[^.][^.]*"

Рукалицо.

2. Используем PowerShell.

3. Используем ls из shell.w32-ix86.zip (ls из BusyBox for windows, тоже не работает, ибо использует WinAPI)

Нас невозможно сбить с пути, нам пофигу куда идти.

5

Re: CMD/BAT: Поведение команды DIR

DnsIs пишет:

вы обратили внимание, что творят утилиты

Я не совсем понял, что именно Вы имели в виду. Я не запускал те конвертеры: только создал файлы командой type nul > FILENAME и пролистал содержимое каталога.

Команды Busybox наследуют соглашениям винды. Можно почитать здесь - https://frippery.org/busybox/globbing.html.

Однако вызов "изнутри" самого Busybox работает правильно:


U:\zzz>busybox64 ls *.doc
x.doc   x.docx

U:\zzz>busybox64 sh -c "ls *.doc"
x.doc

Это согласуется с Вашим наблюдением

ибо использует WinAPI

( 2 * b ) || ! ( 2 * b )

6 (изменено: DnsIs, 2020-11-09 08:17:28)

Re: CMD/BAT: Поведение команды DIR

Rumata пишет:

Я не совсем понял, что именно Вы имели в виду. Я не запускал те конвертеры: только создал файлы командой type nul > FILENAME и пролистал содержимое каталога.

Я понял, что вы не запускали, просто поверьте мне и удивитесь. Утилиты отработали по разному.


Закрываем тему.


PS Разъяснение от Microsoft (см. Примечания)

Нас невозможно сбить с пути, нам пофигу куда идти.

7

Re: CMD/BAT: Поведение команды DIR

DnsIs пишет:

PS Разъяснение от Microsoft (см. Примечания)

Wow! Они таки сделали это!

Подстановочный знак звездочки всегда использует короткое сопоставление имен файлов, поэтому могут возникнуть непредвиденные результаты.