Batch wycinanie pierwszej litery z nazwy pliku

0

Witam ma problem ze skryptem w batchu , mianowicie nie chce utworzyć folderów z pierwszymi literami nazw plików. Proszę o pomoc w dokończeniu zadania.

`@echo off

setlocal EnableDelayedExpansion
set /p sciezka=Podaj sciezke do przeszukania
if not exist “%sciezka%\backup” (mkdir %sciezka%\backup
)
echo %sciezka%
set name=%date%
if not exist “%sciezka%\backup%name%” (mkdir %sciezka%\backup%name%
)

set /p rozszerzenie= Podaj rozszerzenie do poszukiwania

for /r %sciezka% %%g IN (*."%rozszerzenie%") do (
echo %%g

for %%c IN ("%%g") do (

set word=%%~nc
set firstleter=%word:~0,1%
set lit=%firstleter%
echo %lit%
if not exist “%sciezka%\backup%name%%firstleter%” (mkdir %sciezka%\backup%name%%firstleter%
)

)
)
pause

endlocal`

Poniżej dołączam jak powinien działać program ora materiały do zadań .

PRZYKŁAD
Jeżeli system wyszukał dwa pliki o rozszerzeniu jpg o nazwach:
brytyjski.jpg
dachowiec.jpg

To skrypt ma stworzyć strukturę katalogów :
.\BACKUP
└───18.03.2020
├───b


├───d

Następnie skrypt skopiuje odnalezione pliki dopasowując je do katalogów utworzonych w podkatalogu backup[bieżąca_data] - dopasowanie po pierwszej literze nazwy:

PRZYKŁAD
Jeżeli system wyszukał dwa pliki o rozszerzeniu jpg o nazwach:

)

)
brytyjski.jpg
dachowiec.jpg

to drzewko powinno wyglądać jak poniżej

.\BACKUP
└───18.03.2020
├───b
│ brytyjski.jpg

├───d
│ dachowiec.jpg

Skrypt ma wyświetlać informacje:
a) prośbę o podanie ścieżki przeszukiwania
b) prośbę o podanie rozszerzenia - w postaci bez wzorca, np. jpg a nie *.jpg

Skrypt ma być BEZPIECZNY:
a) jeśli użytkownik poda ścieżkę, która nie istnieje - system ma poinformować go o błędzie i przerwać działanie.
b) jeśli użytkownik nie rozszerzenia - również skrypt powinien poinformować o błędzie i przerwać działanie

1

Rzuć BAT-a w cholerę, pisz w czymkolwiek innym np power shellu, lub dowolnym znanym ci języku programowania.

0

Gdyby to ode mnie zależało to bym to zrobił. Ale to zadanie ze systemów na studiach

1

Myślę że największy problem masz w tej linijce

set word=%%~nc

Ja przekierowałbym przypisanie zmiennej "word" (albo nawet tworzenie folderu) do procedury, gdzie z parametru wejściowego za pomocą takiego formatu możesz pobrać wyekstrahować nazwę pliku


for /r %sciezka% %%g IN ("*.%rozszerzenie%") do (
	echo %%g
        goto :PROCEDURA %%g
)

...

goto :eof

 :PROCEDURA 
		set word=%~n1
		set firstleter=%word:~0,1%
		set lit=%firstleter%
		echo %lit%
		if not exist “%sciezka%\backup%name%%firstleter%” (
			echo mkdir %sciezka%\backup%name%%firstleter%
		)
goto :eof

Przepraszam, znowu nie zagłębiałem się w źródło i nie testowałem tego u siebie. Traktuj więc powyższe bardziej jako wskazówkę niż gotowe rozwiązanie.

Pawel

:Edit

poza powyższym kosmetyczna uwaga:

if not exist “%sciezka%\backup” (
	mkdir %sciezka%\backup
)

albo

if not exist “%sciezka%\backup” mkdir %sciezka%\backup
2

Hmm

W skrócie, aby rozwijać zmienne w pętlach poza użyciem linii

setlocal EnableDelayedExpansion

należy zamienić procenty na wykrzykniki, tak jak poniżej.

	for %%c IN ("%%g") do (

		set word=%%~nc
		set firstleter=!word:~0,1!
		set lit=!firstleter!
		echo !lit!
		if not exist “%sciezka%\backup%name%!firstleter!” (
			echo mkdir %sciezka%\backup%name%!firstleter!
		)
		echo !word!
		echo !firstleter!
		echo !lit!

	)

Inaczej zmienne będą aktualizowane po zakończeniu pętli.

Człowiek całe życie się uczy. Właśnie pokazałeś mi jak używać składni " %~nI" z podwójnym procentem :D
dzięki

Paweł

0

Wielkie dzięki za pomoc wszystko działa :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1