Присвоение имени каталога переменной в пакете cmd


5

Я хочу получить имя файла и назначить его переменной, чтобы потом использовать его в скрипте.

set directoryName = dir Docum?nt*
echo %directoryName%

Но как только я запускаю командный файл, все, что я получаю, это.

D:\ >a.bat
D:\ >set directoryName = dir Docum?nt*
D:\ >echo
ECHO is on.

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

мой a.batсодержит:

set directoryName=dir Docum?nt*
echo %directoryName%

После удаления пробелов:

D:\Workspace>set directoryName=dir Docum?nt*

D:\Workspace>echo dir Docum?nt*
dir Docum?nt*

Я предполагаю, что vairbale было назначено целое значение вместе с ключевым словом команды вместо результатов. Я ожидаю, что вывод будет имя каталога, т.е.Documentation


Легко ... использовать set directoryName=dir Docum?nt*просто так. У вас есть пробел, поэтому просто удалите его ... Дайте мне знать, если это поможет, и я добавлю ответ.
Сок Pimp IT

Ответы:


3

У вас есть пробел до и после знака равенства для установки переменной, просто удалите его и, например, используйте метод ниже.

@ECHO ON

set directoryName=dir Docum?nt*
echo %directoryName%

Неправильно

  • set directoryName = dir Docum?nt*

Правильный

  • set directoryName=dir Docum?nt* введите описание изображения здесь

Неявный для цикла

FOR /F "TOKENS=*" %%F IN ('DIR /B /AD "Docum?nt*"') DO SET directoryName=%%~F

Рекурсивный цикл FOR

FOR /F "TOKENS=*" %%F IN ('DIR /B /AD /S "Docum?nt*"') DO SET directoryName=%%~F

Дополнительные ресурсы


Спасибо, у меня все еще есть проблемы с выводом, пожалуйста, проверьте мой обновленный вопрос.
Maven

@Maven Я только что обновил свой ответ, поскольку вы обновили вопрос, добавив его в цикл для команды DIR и подстановочных знаков, чтобы получить ожидаемый результат (ы). Возможно, вам понадобится добавить логику IF, чтобы отфильтровать ее по какому-то явному имени папки, иначе он получит все совпадения.
Сок Pimp IT

4

Если вам нужно установить подходящее имя каталога Docum?nt*, то вам нужно:

for /d %%d in (Docum?nt*) do set directoryName="%%d"

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


3

Пробелов нет

Если вам нужно использовать пробел в именах, поместите их в этот формат:

set directoryName = "dir Docum?nt*"

Это либо "", либо нет пробелов .


Спасибо, у меня все еще есть проблемы с выводом, пожалуйста, проверьте мой обновленный вопрос.
Maven

@Maven: Overmind означает пробелы в указанном имени переменной. Ваш обновленный код не соответствует коду, предложенному в этом ответе.
Гонки

2

Я ожидаю, что вывод будет имя каталога, т.е. Documentation

Вы не получите Documentationв качестве вывода, если не выполните команду, которую вы сохранили в переменной.

Используйте следующий пакетный файл (test.cmd):

@echo off
setlocal
set directoryName=dir Docum?nt*
rem run command
cmd /c %directoryName%
pause 
endlocal

Пример вывода:

> test
dir Docum?nt*
 Volume in drive F is Expansion
 Volume Serial Number is 3656-BB63

 Directory of F:\test

09/03/2017  17:10    <DIR>          Documentation
               0 File(s)              0 bytes
               1 Dir(s)  1,701,065,842,688 bytes free

Дальнейшее чтение

  • Индекс AZ командной строки Windows CMD - отличный справочник для всех
  • cmd - Запустить новую оболочку CMD и (необязательно) запустить команду / исполняемую программу.
  • dir - Показать список файлов и подпапок.
  • set - отображать, устанавливать или удалять переменные окружения CMD. Изменения, сделанные с помощью SET, будут сохраняться только в течение текущего сеанса CMD.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.