1

Я хочу создать опцию в контекстном меню файлов, которые получат их имена. Моя проблема сейчас в том, как установить имя файла в качестве значения в CMD?

Я попробовал это:

    @echo off
    for /r %%f in (*.bat) do (
    set w=%%~nxf
    echo %w%
    )
    pause

Но w пуст после запуска.

1 ответ1

3

ну, в моей системе есть проблема с вашим пакетным скриптом, который я опишу, но я не знаю, почему ваш w пуст после запуска, но если вы удалите @echo off, вы сможете увидеть, что происходит. и из этого объяснения, может быть, мы увидим, почему он пуст. Должно быть, последний параметр w устанавливает его на ноль.

    @echo off
    for /r %%f in (*.bat) do (
    set w=%%~nxf
    echo %w%
    )
    pause

Выше проблема в том, что вы используете %...% в цикле for, и то, что происходит с %var% в цикле for, например %w% в пакетных файлах, очень странно по сравнению с любым другим языком! %w% будет заменен на %w% , и не после этого.

Вы можете попытаться проверить это, выполнив команду set w = abcdefg, затем запустите ваш пакетный файл и посмотрите, не является ли w тем же.

Но на моем компьютере, после того, как он запустится, установите w=%%~nxf и затем у вас есть эхо %w% что %w% там в эхо, затем установите текущее значение %%~nxf , которое является вашим первым файл летучей мыши. И это все. Так и остается. Это не то, что вы намерены, без сомнения, но это то, что происходит.

Вот ваш файл bat, который я удалил @echo off.

for /r %%f in (*.bat) do (
set w=%%~nxf
echo %w%
)

Вот вывод, показывающий, что происходит, что я и описал. % W% сохраняет свое первое значение.

C:\crp>spo <Return>

C:\crp>for /R %f in (*.bat) do (
set w=%~nxf
 echo spo2.bat
)

C:\crp>(
set w=a.bat
 echo spo2.bat
)
spo2.bat

C:\crp>(
set w=b.bat
 echo spo2.bat
)
spo2.bat

C:\crp>(
set w=spo.bat
 echo spo2.bat
)
spo2.bat

C:\crp>(
set w=spo2.bat
 echo spo2.bat
)
spo2.bat

C:\crp>

Вам нужно добавить setlocal .... и заменить% var% на!вар! тогда вы получите нормальное поведение!

@echo off
setlocal enableextensions enabledelayedexpansion
for /r %%f in (*.bat) do (
    set w=%%~nxf
    echo !w!
)


C:\crp>spo2
a.bat
b.bat
spo.bat
spo2.bat

C:\crp>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .