2012-08-22 12 views
8

Mam następujący ciąg wewnątrz mój plik wsadowy Windows:Usuń pierwszy i ostatni znak z łańcucha w pliku wsadowym systemu Windows

"-String" 

ciąg zawiera również cudzysłowów twoe na początku i na końcu ciąg, tak jak jest napisany powyżej.

chcę się rozebrać pierwsze i ostatnie znaki tak, że pojawia się następujący ciąg:

-String 

Próbowałem to:

set currentParameter="-String" 
echo %currentParameter:~1,-1% 

ten wypisuje ciąg jak powinno być:

-String 

Ale gdy próbuję zapisać zmieniony ciąg w ten sposób, to zawiedzie:

set currentParameter="-String" 
set currentParameter=%currentParameter:~1,-1% 
echo %currentParameter% 

Nic nie zostanie wydrukowane. Co mam zrobić źle?


To naprawdę dziwne. Kiedy usunąć znaki jak to działa:

set currentParameter="-String" 
set currentParameter=%currentParameter:~1,-1% 
echo %currentParameter% 

wypisze:

-String 

Ale faktycznie moja partia jest nieco bardziej skomplikowana, a tam nie działa. pokażę co mam zaprogramowane:

@echo off 

set string="-String","-String2" 

Set count=0 
For %%j in (%string%) Do Set /A count+=1 


FOR /L %%H IN (1,1,%COUNT%) DO ( 

    echo . 
     call :myFunc %%H 
) 
exit /b 

:myFunc 
FOR /F "tokens=%1 delims=," %%I IN ("%string%") Do (

    echo String WITHOUT stripping characters: %%I 
    set currentParameter=%%I 
    set currentParameter=%currentParameter:~1,-1% 

    echo String WITH stripping characters: %currentParameter% 

    echo . 

) 
exit /b 

:end 

a wyjście jest:

. 
String WITHOUT stripping characters: "-String" 
String WITH stripping characters: 
. 
. 
String WITHOUT stripping characters: "-String2" 
String WITH stripping characters: ~1,-1 
. 

Ale co chcę jest:

. 
String WITHOUT stripping characters: "-String" 
String WITH stripping characters: -String 
. 
. 
String WITHOUT stripping characters: "-String2" 
String WITH stripping characters: -String2 
. 
+0

Twoje prace próbek (zgodnie z oczekiwaniami), musi istnieć inny bug . Może próbowałeś tego wewnątrz bloku? – jeb

+0

Otrzymuję następujący komunikat: 'ECHO ist ausgeschaltet (OFF). ~ 1, -1' – Metalhead89

+0

Może to dlatego, że jest w funkcji? ': myFunc dla "tokeny =% 1 delims =",/F %% I IN ("% processChain1%") Do ( \t zestaw currentParameter = %% I \t zestaw currentParameter =% currentParameter: ~ 1 -1% \t echo% currentParameter% \t REM Java jar app.jar %% że ) /wyjścia FALSE – Metalhead89

Odpowiedz

4

Jesteś modyfing zmienną wewnątrz nawiasach bloku. Uważaj - nowa wartość nie będzie używana w tym samym bloku (chyba, że ​​ograniczasz zmienną za pomocą! Zamiast% - i działasz w trybie enabledelayedexpansion). Albo po prostu wyodrębnić kilka linii do innego sub-funkcji, stosując zwykły ciąg linii insted()

wita, Stach

4

nadzieję, że pomoże. echo String BEZ usuwania znaków: %% I

set currentParameter=%%I 
set currentParameter=!currentParameter:~1,-1! 

echo String WITH stripping characters: !currentParameter! 

echo . 

może ona działać. Spróbuj tego raz.

2

Ten skrypt korzysta z ENABLEDELAYEDEXPANSION. Jeśli nie wiesz, skrypty wsadowe są wykonywane dla wszystkich komend i jeśli je wykonują; Stąd jeśli zrobić:

if true==true (
@echo off 
set testvalue=123 
echo %testvalue% 
pause >NUL 
) 

wont niczego wyjścia, bo gdy echo% testValue% jest wykonywany, nie rozpoznał testValue została zmieniona. Korzystanie z delayedexapnsion pozwala skryptowi odczytać tę wartość taką, jaka jest teraz, i zapomnieć o problemie, który wcześniej stawiłem. Używasz go tak jak% testvalue%, ale możesz zrobić! Testvalue! aby rozwiązać ten problem:

if true==true (
@echo off 
set testvalue=123 
echo !testvalue! 
pause >NUL 
) 
  • Czy echo 123.

@echo off 
SETLOCAL ENABLEDELAYEDEXPANSION 
set string="-String","-String2" 
Set count=0 

For %%j in (%string%) Do Set /A count+=1 

FOR /L %%H IN (1,1,%COUNT%) DO ( 
echo . 
call :myFunc %%H 
) 

exit /b 
:myFunc 

FOR /F "tokens=%1 delims=," %%I IN ("%string%") Do (
echo String WITHOUT stripping characters: %%I 
set currentParameter=%%I 
set currentParameter=!currentParameter:~1,-1! 
echo String WITH stripping characters: !currentParameter! 
echo . 
) 

exit /b 
:end 

~ Alex

Powiązane problemy