Przypisywanie nazwy katalogu do zmiennej wsadowej cmd

5

Chcę pobrać nazwę pliku i przypisać ją do zmiennej, dzięki czemu będę mógł użyć jej dalej w skrypcie.

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

Ale gdy tylko wykonam plik wsadowy, otrzymam tylko to.

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

Jak mogę się upewnić, że mojej zmiennej przypisano wartość, tj. Nazwę katalogu, dzięki czemu mogę zacząć pisać dalszy skrypt.

mój a.bat zawiera:

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

Po usunięciu spacji:

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

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

Domyślam się, że zmiennej przypisano całą wartość wraz ze słowem kluczowym command zamiast wyników. Oczekuję, że dane wyjściowe będą nazwą katalogu, tj. Documentation

Maven
źródło
Łatwe ... korzystanie set directoryName=dir Docum?nt* właśnie tak. Masz białe znaki, więc po prostu je usuń ... Daj mi znać, jeśli to pomoże, a dodam odpowiedź.
Pimp Juice IT

Odpowiedzi:

3

Masz białe znaki przed i po znaku równości ustawienia zmiennej, po prostu usuń ją i użyj na przykład poniższej metody.

@ECHO ON

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

Źle

  • set directoryName = dir Docum?nt*

Poprawny

  • set directoryName=dir Docum?nt* enter image description here

Niejawne dla pętli

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

Rekurencyjna pętla FOR

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

Dalsze zasoby

Pimp Juice IT
źródło
Dziękuję, wciąż mam problemy z wyjściem, sprawdź moje zaktualizowane pytanie.
Maven
@Maven Właśnie zaktualizowałem swoją odpowiedź, ponieważ zaktualizowałeś pytanie w taki sposób, aby umieścić to w pętli dla polecenia DIR i symboli wieloznacznych, aby uzyskać oczekiwane wyniki. Może zajść potrzeba dodania logiki IF, aby odfiltrować ją do czegoś wyraźnie nazwanego mądrego folderu, lub dostanie wszystkie dopasowania.
Pimp Juice IT
4

Jeśli chcesz ustawić nazwę katalogu, która pasuje Docum?nt*, to czego potrzebujesz to:

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

Jeśli więcej niż jeden katalog pasuje do maski, otrzymasz tylko jedno dopasowanie. Jeśli potrzebujesz zmiennej do przechowywania listy pasujących katalogów, musisz użyć for /f.

AFH
źródło
3

Bez odstępów.

Jeśli musisz użyć spacji w nazwach, umieść je w tym formacie:

set directoryName = "dir Docum?nt*"

To albo „” lub bez odstępów .

Overmind
źródło
Dziękuję, wciąż mam problemy z wyjściem, sprawdź moje zaktualizowane pytanie.
Maven
@Maven: Overmind oznaczało spacje w podanej nazwie zmiennej. Zaktualizowany kod nie pasuje do kodu sugerowanego w tej odpowiedzi.
Lightness Races in Orbit
2

Oczekuję, że dane wyjściowe będą nazwą katalogu, tj. Documentation

Nie dostaniesz Documentation jako wyjście, chyba że biegać polecenie zapisane w zmiennej.

Użyj następującego pliku wsadowego (test.cmd):

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

Przykładowy wynik:

> 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

Dalsze czytanie

  • Indeks A-Z wiersza polecenia Windows CMD - Doskonałe odniesienie dla wszystkich
  • cmd - Uruchom nową powłokę CMD i (opcjonalnie) uruchom komendę / program wykonywalny.
  • reż - Wyświetl listę plików i podfolderów.
  • zestaw - Wyświetl, ustaw lub usuń zmienne środowiskowe CMD. Zmiany wprowadzone za pomocą SET pozostaną tylko na czas bieżącej sesji CMD.
DavidPostill
źródło