Pętla ze ścieżką zawierającą spację

0

Potrzebuje pomocy w poprawieniu poniższego skryptu .bat bo nie mam doświadczenia w pisaniu takich rzeczy a z tutoriala w necie to ciężko. Problemem jest to że w pathu jest spacja, być może coś więcej. Ktoś umiał by to niżej poprawić?

for /R "D:\Gry\EA SPORTS" %%var in (*.png) do echo %%var 

czyli innymi słowy dla każdego pliku z tego folderu, subfolderow pokaż nazwe pliku jak ma roszerzenie png
Druga sprawa to jak w pathu dać ścieżkę względną w stosunku do skryptu .bat, jak w linuxie kropka i spacja "./" ? czy jakoś inaczej?

3

spacja nie jest problemem, tylko to że zmienna może być tylko jednoliterowa

for /R "D:\Gry\EA SPORTS" %%v in (*.png) do echo %%v

działa ok

fvg napisał(a):

Druga sprawa to jak w pathu dać ścieżkę względną w stosunku do skryptu .bat, jak w linuxie kropka i spacja "./" ? czy jakoś inaczej?

Tak, tylko ukośnik w drugą stronę
Tylko że to będzie ścieżka względna od obecnego folderu, jeśli chcesz uzyskać ścieżke pliku .bat to musisz zrobić %~dp0

0

Zmienna v przechowuje ścieżkę. Jak wobec tego wyłuskać tylko nazwę pliku? Bo musze w toolu decompressd.exe ustawić input (arg1) i output (arg2). No i właśnie dla outputu potrzebuje tylko nazwy pliku bo to niżej mi nie działa bo zły jest path dla outputu.

for /R ".\portraits\club\160x160" %%v in (*.png) do decompressd.exe %%v .\decompressed\portraits\club\160x160\%%v
1

%~I - expands %I removing any surrounding quotes (")
%~fI - expands %I to a fully qualified path name
%~dI - expands %I to a drive letter only
%~pI - expands %I to a path only
%~nI - expands %I to a file name only
%~xI - expands %I to a file extension only
%~sI - expanded path contains short names only
%~aI - expands %I to file attributes of file
%~tI - expands %I to date/time of file
%zI - expands %I to size of file
%
$PATH:I - searches the directories listed in the PATH
environment variable and expands %I to the
fully qualified name of the first one found.
If the environment variable name is not
defined or the file is not found by the
search, then this modifier expands to the
empty string

po prostu %~nv.%~xv

0

Czasami jak wykonuje skrypt to w wyniku błędnego obrabianego pliku png oraz w wyniku buga w open soursowym toolu decompressd.exe (jakaś asercja fejluje jak patrze na kod) taki komunikat mi się pojawia:
(https://4programmers.net/uploads/99874/GhORrejWJl7DPjy2lPJnSWi3XbtXZIkhWdd3zvem.jpg)
i musze wcisnąć ponów próbę i zamknij i wtedy wykonywanie pętli idzie dalej, przechodzi do nastepengo itemu w forze.
Czy da się tutaj coś zrobić by ten błąd został olany (no trudno z jednym plikiem się nie udało, niech program leci dalej bez manualnej interwencji).
for /R ".\input\portraits\club\160x160" %%v in (
.png) do decompressd.exe %%v .\intermediateOutput\user\Picture%%~nv%%~xv

1

to już się robi zbyt skomplikowane dla pliku wsadowego, możesz wystartować to decompressd bez czekania przez dopisanie start na początku (start decompressd), ale wtedy odpali się tyle instancji aplikacji jednocześnie ile jest plików i może być lekki chaos

0

a teraz z kolei potrzebuję pobrania kontentu do zmiennej. Jak w skrypcie windowsowym robię:

plink 192.168.115.7 -l root -pw root -batch "cat /etc/version"

to mi to printuje w command linie 1 linijke stringa, wersje softu zdalnego urządzenia i jak to zapisać do zmiennej? Cos w stylu by sie przydało jak w bashu chyba tak było: x=$(plink 192.168.115.7 -l root -pw root -batch "cat /etc/version")
Potem będę porównywał x-a z nazwą softu czy sie zgadza ale to już pewnie na google coś znajdę

1

można przez pipe jako wejście do set

plink 192.168.115.7 -l root -pw root -batch "cat /etc/version" | set /p x=
echo %x%

albo for z opcją usebackq

for /F usebackq %%v IN (`plink 192.168.115.7 -l root -pw root -batch "cat /etc/version"`) DO set x=%%v
echo %x%
0

Mam taki problem że if mi okazjonalnie działa, co w nim może być źle. W ogóle nie rozumiem tego problemu:

echo "check sw version before update"
plink 192.168.55.3 -l root -pw root -batch "cat /etc/version" > tmp.txt
call "sleep1s.bat"
set /P currSwVersion=<tmp.txt
call "sleep1s.bat"
if NOT "%currSwVersion%" == "string na okolo 50 znakow spacje itp" goto UNEXPECTED_SW_VERSION

Printuje też jak idę do goto co zawiera zmienna currSwVersion i jest taki sam string jak po prawo. Magia. Sleepy 1 sekundowe też dałem aby wykluczyć że nie skończył zapisywać do filesystemu czy odczytywać z pliku tmp.txt.
Czyli innymi słowy mam test w ktorym wiem że nie powinnem wejść do ifa a wszedłem mimo że lewa strona jest równa prawej. Do pliku tmp zapisuję bo nie umiem tego uprościć, ale suma sumarum nie musi być tego pliku, ważne aby w zmiennej currSwVersion znalazł się output ze zdalnej maszyny z /etc/version

1

Zamiast if not "a" == "b" możesz wpisać if "a" NEQ "b", if kiedyś nie lubił spacji obok ==
Podejrzewam że problem tu jest z białymi znakami, z tego co widzę wypisujesz plik z maszyny linuksowej, może mieć inne zakończenie linii które jest traktowane jako znak.
Proponuję zapisać oczekiwany wynik plink 192.168.55.3 -l root -pw root -batch "cat /etc/version" do innego pliku i potem odczytać go w ten sam sposób, wtedy będziesz miał pewność że wszystkie białe znaki są porównywane w ten sam sposób i jednocześnie ułatwisz konfigurację skryptu bo wartość będzie łatwiej zmienić bez edycji skryptu

Czemu się tak uparłeś na ten .bat? Skrypty bat są strasznie problematyczne i nie nadają się do niczego skomplikowanego, proponuję przejście na powershell, python albo jakikolwiek współczesny skryptowy język którego parser jesteś w stanie tam zainstalować. Nawet jscript / vbscript byłby łatwiejszy w obsłudze.

0

ok dzieki to spróbuje czegoś takiego:

if "%currSwVersion:~0,25%" NEQ "string25 znakow bez spacji" goto UNEXPECTED_SW_VERSION
0
fvg napisał(a):

ok dzieki to spróbuje czegoś takiego:

if "%currSwVersion:~0,25%" NEQ "string25 znakow bez spacji" goto UNEXPECTED_SW_VERSION

jednak to też nie pomogło. Co ciekawe jak sie nie udaje w automacie to potem ręcznie próbuje i juz zawsze działa. To jakaś magia jest.

0

a ktoś umiałby napisać pętle abym nie musiał 560 linii pisać z komendą xcopy? Mam 80 folderów pk0-miscstadiumtexobj.topk0-miscstadiumtexobj__t10004__x_y_z. W każdym z tych folderów są pliki: 0000.BMP, 0001.BMP, 0002.BMP, 0003.BMP, 0004.BMP, 0005.BMP, 0006.BMP. Czyli bez pętli for muszę 80x7=560 linii naklepać. A jakby sie dało znajdować folder to by było 8 linii, coś w stylu:

for each found folder beginning from string "pk0" in ".\" do:
xcopy ".\input\0000.BMP" ".\foundFolder\0000.BMP"
xcopy ".\input\0001.BMP" ".\foundFolder\0001.BMP"
xcopy ".\input\0002.BMP" ".\foundFolder\0002.BMP"
xcopy ".\input\0003.BMP" ".\foundFolder\0003.BMP"
xcopy ".\input\0004.BMP" ".\foundFolder\0004.BMP"
xcopy ".\input\0005.BMP" ".\foundFolder\0005.BMP"
xcopy ".\input\0006.BMP" ".\foundFolder\0006.BMP"

Moge też przenieść pliki z inputu do "./" i skasować folder "input" jak to za trudne, więc wtedy for by był:

for each found folder in ".\" do:
1

a nie wystarczy

xcopy ".\input\*.BMP" ".\foundFolder\*.BMP"

?

Poza tym używaj robocopy zamiast xcopy. Xcopy jest przestarzałe, nie wspiera dużo rzeczy, jak na przykład długich nazw plików (>260)

0

ok czyli explicite musiałbym napisać nazwy folderów, czyli 80 linii by było. Sprawdze czy 0001.BMP z 0001.BMP sie zastępuje itd.

a ok w sumie to moge spróbować:

xcopy ".\input\0000.BMP" ".\pk0*\0000.BMP"
xcopy ".\input\0001.BMP" ".\pk0*\0001.BMP"
xcopy ".\input\0002.BMP" ".\pk0*\0002.BMP"
xcopy ".\input\0003.BMP" ".\pk0*\0003.BMP"
xcopy ".\input\0004.BMP" ".\pk0*\0004.BMP"
xcopy ".\input\0005.BMP" ".\pk0*\0005.BMP"
xcopy ".\input\0006.BMP" ".\pk0*\0006.BMP"
0

Nie no wystarczy chyba

FOR /D %%i IN (*) DO xcopy ".\%%i\*.BMP" ".\foundFolder\*.BMP"

0

Mam program który przyjmuje 2 argumenty. Pierwszy to plik wejściowy a drugi wyjściowy. I jak go wykonam:

@echo off

for /R %%f in (*.tga) do (
    D:\FolderyDoPrzetworzenia\decompressd.exe %%f %%~nfUNCOMPRESSED%%~xf
)

to w folderze D:\FolderyDoPrzetworzenia otrzymuję pliki zdekompresowane,
A ja chciałbym, aby te pliki pojawiły się w podfolderach tam gdzie są wejściowe a nie wszystko w głównym katalogu.
Bo mam taką strukturę:
FolderyDoPrzetworzenia\A
FolderyDoPrzetworzenia\A\B
FolderyDoPrzetworzenia\C
FolderyDoPrzetworzenia\C\E\F
FolderyDoPrzetworzenia\C\E\G
itp.

Jaki wobec tego argument drugi podać? Na razie mam:
%%~nfUNCOMPRESSED%%~xf a więc dla pliku wejściowego button.tga otrzymuje nazwę wyjściowego buttonUNCOMPRESSED.tga. Tylko aby ten zdekompresowany plik pojawił się w tym samym katalogu co wejściowy. Czegoś jeszcze brakuje w tym drugim argumencie.

0

zamień %%~nfUNCOMPRESSED%%~xf na %%~dpnfUNCOMPRESSED%%~xf
I przesiądź się może na jakiś normalny język programowania w którym będziesz mógł sobie debugować i będziesz miał dostęp do normalnych bibliotek i narzędzi. Polecam python, c# czy choćby powershell

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