2015-05-10 11 views
6

Wsad plik args.bat jest dla celów testowych:Batch Argument z cytatami i przestrzeni

@echo off 
echo Arguments 1 to 4: 
echo.%~1 
echo.%~2 
echo.%~3 
echo.%~4 

Plik wsadowy używa ~ usunąć początkowe i końcowe cudzysłów, a powinien on wykazywać następujące wartości dla użytkownika :

Argument 1 
This is "Argument 2". 

Dla argumentu 1, to proste:

args.bat "Argument 1" 

Jednak dla argumentu 2 rzeczy nie działa dobrze, bez względu na to ucieczka sekwencja Staram (znalazłem kilka tutaj na przepełnienie stosu):

// Didn't expect this to work, but for completeness 
>args.bat "Argument 1" "This is "Argument 2"." 
Arguments 1 to 4: 
Argument 1 
This is "Argument 
2"." 

Uciekając z cudzysłów jakoś przechodzi cudzysłowia na:

>args.bat "Argument 1" "This is ""Argument 2""." 
Arguments 1 to 4: 
Argument 1 
This is ""Argument 2"". 

Uciekając z daszkiem:

>args.bat "Argument 1" "This is ^"Argument 2^"." 
Arguments 1 to 4: 
Argument 1 
This is "Argument 
2"." 

Ucieczka z backslash:

>args.bat "Argument 1" "This is \"Argument 2\"." 
Arguments 1 to 4: 
Argument 1 
This is \"Argument 
2\"." 

Pamiętaj Próbowałem całą masę innych rzeczy (ostatecznie myśli brute-zmuszając rozwiązania, ale stawiając pytanie pierwsze), z których każda prowadzi do wyjścia zabawne, ale nigdy, czego chcę:

>args.bat "Argument 1" ^"This is ^^"Argument^" 2^^"." 
Arguments 1 to 4: 
Argument 1 
This is "Argument" 2". 

Czy jest możliwe przekazanie parametru do pliku wsadowego, tak jak chcę, bez zmiany pliku wsadowego? Jeśli nie, czy istnieje sposób na uruchomienie cmd w trybie specjalnym, aby traktował parametry tak jak ja?

Widziałem rozwiązania służące do wyszukiwania i zamiany podwójnych cudzysłowów, ale naprawdę chcę, aby plik wsadowy pozostawał niezmieniony.

+0

możliwy duplikat [Escaping Double Quotes in Batch Script] (http://stackoverflow.com/questions/562038/escaping-double-quotes-in-batch-script) –

+0

@BenjyKessler: Czytam odpowiedzi tam i w moje pytanie, które napotkacie, wypróbowałem zarówno znaki podwójnego cudzysłowu, jak i znaki ewakuacyjne. Żadna z nich nie działa. –

Odpowiedz

3

Nie można wprowadzić takiego argumentu do %1 (ani żadnego innego %<n>).

Ale z małą sztuczką to możliwe.

args.bat arg1 "To jest! Q! Argument 2! Q!"

I args.bat wygląda

setlocal EnableDelayedExpansion 
set "q="" 
echo * = %* 
echo 1 = %~1 
echo 2 = %~2 

Albo też jest to możliwe

@echo off 
setlocal EnableDelayedExpansion 
set "arg1=%~1" 
set "arg2=%~2" 
echo * = %* 
echo 1 = %arg1:""="% 
echo 2 = %arg2:""="% 

Następnie można nazwać z args.bat "This is ""Argument 1"""

Jeśli nie chcą pracować z tym technice możesz również zdecydować się na samodzielne przeanalizowanie argumentów.
Następnie musisz wziąć wszystkie argumenty od %* i przejść przez każdą postać.

Edit
Jeśli nie można modyfikować skrypty w ogóle, a następnie można użyć pierwszego rozwiązanie jedną modyfikację.

W wierszu polecenia.

C:\SomeDir> cmd /V:ON 
C:\SomeDir> set "q="" 
C:\SomeDir> args.bat argument1 "This is ^!q^!Argument 2^!q^!" 

lub jako jedną-liner

cmd /v:on /c set ^^^"q=^^^"^^^" ^& test "This is ^!q^!Argument 2^!q^!" 

Stosując ten pozwala na odblokowanie opóźnionego trybu przed wejściem plik wsadowy, to może mieć jakiś inny niepożądanych efektów ubocznych w nazwie pliku wsadowego, jeśli nie robi nie obchodzi się prawidłowo z tą sprawą.

+1

Ale czy można to zrobić bez edytowania skryptu? Tak właśnie czytam to pytanie. Wyobrażam sobie, że to jest praca i istnieje system wdrażania skryptów, który wymaga, aby wszystkie zmiany były dokładnie sprawdzane i testowane, co może powodować opóźnienia w dniach lub tygodniach. – SomethingDark

+0

Masz rację, dodałem rozwiązanie, które nie wymaga modyfikacji skryptu – jeb