Muszę przekazać identyfikator i hasło do pliku wsadowego podczas uruchamiania, a nie zakodować je na stałe w pliku.
Oto jak wygląda linia poleceń:
test.cmd admin P@55w0rd > test-log.txt
batch-file
arguments
Keng
źródło
źródło
Odpowiedzi:
Inną przydatną wskazówką jest użycie słowa
%*
„wszystko”. Na przykład:Kiedy biegniesz:
powyższy plik wsadowy zostanie uruchomiony:
Mogę mieć nieco niepoprawną składnię, ale taka jest ogólna idea.
źródło
shift
„wyskakuje” argument z listy. Założeniem OP było%*
wyprowadzenie tylko pozostałych argumentów, ale to nie działa w ten sposób, jak powiedział @Joey.fake-command /u admin /p password admin password foo bar
. Zwrócił na to uwagę @Joey wiele lat temu.Oto jak to zrobiłem:
Oto jak wygląda polecenie:
%1
Odnosi się do pierwszego parametru na%2
(i tu jest częścią trudne) odnosi się do drugiego. W ten sposób można przekazać do 9 parametrów.źródło
echo %1 %2
i był odtrącony przez niemożliwą do wycięcia i wklejenia najprostszą skrzynkę z@
aifake-command
z parametrami, myśląc, że dostaniemyfake-command.bat
zawartość później (w takim przypadku zbyt skomplikowanefake-command.bat
może byćecho %2 %4
konieczne zignorowanie nazw parametrów). Źle, doofus. TL; DR: Nie bądź taki głupi jak ja. 1.echo echo %1 %2 > test.bat
2test word1 word2
.. 3. Zysk.Jeśli chcesz inteligentnie obsłużyć brakujące parametry, możesz zrobić coś takiego:
źródło
Dostęp do parametrów wsadowych może być prosty za pomocą% 1,% 2, ...% 9 lub również% *,
ale tylko jeśli zawartość jest prosta.
Nie ma prostego sposobu na złożone treści, takie jak
"&"^&
, ponieważ nie można uzyskać dostępu do% 1 bez spowodowania błędu.Linie rozwijają się do
I każdy wiersz kończy się niepowodzeniem, ponieważ jeden z nich
&
znajduje się poza cytatami.Można to rozwiązać poprzez odczytanie z pliku tymczasowego zaznaczonej wersji parametru.
Sztuką jest włączenie
echo on
i rozwinięcie% 1 porem
instrukcji (działa również z%2 .. %*
).Tak więc
"&"&
można nawet powtórzyć bez powodowania błędu, jak to zauważono.Ale aby móc przekierować wyjście
echo on
, potrzebujesz dwóch pętli for.Dodatkowe znaki
* #
są używane, aby zabezpieczyć się przed takimi treściami, jak/?
(pokaże pomocREM
).Lub karetka ^ na końcu linii może działać jako znak wielowierszowy, nawet po
rem
.Następnie odczytaj dane wyjściowe parametru rem z pliku, ale ostrożnie.
FOR / F powinien działać z wyłączonym opóźnionym rozszerzaniem, w przeciwnym razie zawartość „!” zostanie zniszczony.
Po usunięciu dodatkowych znaków
param1
masz go.Aby używać
param1
w bezpieczny sposób, włącz opóźnioną ekspansję.źródło
&
, twoje rozwiązanie działa tylko z prostą zawartościątest.bat ^&
i nie działa.test.bat "&"
Działa tylko , ale nie o to mi chodziło. Nie można używać%*
,%1
w sposób bezpieczny, bez techniki REM&
handlowe i cytaty"
Tak, i po prostu nie zapomnij użyć zmiennych, takich jak
%%1
podczas używaniaif
ifor
i gangu.Jeśli zapomnisz podwójnego
%
, będziesz zastępował argumenty wiersza poleceń (być może zerowym) i będziesz otrzymywać dość mylące komunikaty o błędach.źródło
if
ifor
?for %%d in (*) do echo %%d
z wiersza poleceń:for %d in (*) do echo %d
@for %%2 in (testing) do @echo %%2 %1
w pliku wsadowym, powstaje,testing 1
gdy zostanie wywołany za pomocą 1 (test 1
).%%1
nie ma dostępu do argumentu wiersza poleceń i jest również niepoprawny dlaIF
polecenia. TylkoFOR
polecenie (w plikach wsadowych) wymaga podwójnych procentów, ale nawet wtedy%%1
zdefiniowałoby parametr FOR i nie ma dostępu do argumentówNie trzeba tego komplikować. Jest to po prostu polecenie% 1% 2 parametrów, na przykład
„Pauza” pokazuje, co zrobił plik wsadowy i czeka na naciśnięcie DOWOLNEGO klawisza. Zapisz to jako xx.bat w folderze Windows.
Aby go użyć, wpisz na przykład:
Ten plik wsadowy dba o wszystkie niezbędne parametry, takie jak kopiowanie tylko plików, które są nowsze itp. Używałem go wcześniej niż system Windows. Jeśli chcesz zobaczyć nazwy plików podczas ich kopiowania, pomiń
Q
parametr.źródło
Znajomy pytał mnie ostatnio o ten temat, więc pomyślałem, że opublikuję, jak radzę sobie z argumentami wiersza poleceń w plikach wsadowych.
Ta technika ma trochę narzutu, jak zobaczysz, ale sprawia, że moje pliki wsadowe są bardzo łatwe do zrozumienia i szybkiego wdrożenia. Oprócz wspierania następujących struktur:
Jist z nich jest posiadanie
:init
,:parse
oraz:main
funkcje.źródło
Uwaga: JEŻELI
"%1"==""
spowoduje problemy, jeśli%1
jest zawarte w samych cytatach.W takim przypadku użyj
IF [%1]==[]
lub, w NT 4 (SP6) i tylko późniejIF "%~1"==""
.źródło
Uprośćmy to.
Oto plik .cmd.
Oto 3 połączenia z wiersza poleceń.
źródło
Powoduje to zapętlenie parametrów wsadowych (% *), które są cytowane lub nie, a następnie echa każdego parametru.
źródło
test.bat *.txt
,test.bat cat^&dog
lubTest.bat /?
Napisałem prosty skrypt read_params, który można wywołać jako funkcję (lub zewnętrznie
.bat
) i umieści wszystkie zmienne w bieżącym środowisku. Nie zmodyfikuje oryginalnych parametrów, ponieważ funkcja jest edytowanacall
z kopią oryginalnych parametrów.Na przykład, biorąc pod uwagę następujące polecenie:
myscript.bat
będzie mógł używać zmiennych po wywołaniu funkcji:Oto funkcja:
Ograniczenia
-force
. Możesz użyć,-force=true
ale nie mogę wymyślić sposobu, aby zezwolić na puste wartości bez znajomości listy parametrów, które nie będą miały wartości.Dziennik zmian
-
parametrów przed.źródło
W pliku wsadowym
A w wierszu poleceń podaj argument
Wyjście będzie
źródło
Aby odwołać się do ustawionej zmiennej w wierszu poleceń, musisz użyć
%a%
na przykład:Uwaga: Działa to dla systemu Windows 7 pro.
źródło
Zainspirowany odpowiedzią @Jon opracowałem bardziej ogólny algorytm do wyodrębniania nazwanych parametrów, wartości opcjonalnych i przełączników.
Powiedzmy, że chcemy wdrożyć narzędzie
foobar
. Wymaga początkowego polecenia. Ma opcjonalny parametr,--foo
który przyjmuje opcjonalną wartość (która oczywiście nie może być innym parametrem); jeśli brakuje wartości, domyślnie jest todefault
. Ma również opcjonalny parametr,--bar
który przyjmuje wymaganą wartość. Wreszcie może wziąć flagę--baz
bez dozwolonej wartości. Aha, i te parametry mogą występować w dowolnej kolejności.Innymi słowy, wygląda to tak:
Oto rozwiązanie:
SETLOCAL
aby zmienne nie uciekały do środowiska wywołującego.SET FOO=
itp. Na wypadek, gdyby ktoś zdefiniował je w środowisku wywołującym.%~1
do usuwania cytatów.IF "%ARG%" == ""
a nieIF [%ARG%] == []
dlatego, że[
i]
nie graj w ogóle z wartościami kończącymi się spacją.SHIFT
znajdujesz się wIF
bloku, bieżące argumenty, takie jak%~1
nie są aktualizowane, ponieważ są ustalane podczasIF
analizy. Możesz użyć%~1
i%~2
wewnątrzIF
bloku, ale byłoby to mylące, ponieważ miałeśSHIFT
. Możesz umieścićSHIFT
koniec na końcu bloku dla jasności, ale to może się zgubić i / lub dezorientować również ludzi. Zatem „wychwytywanie”%~1
i%~1
poza blokiem wydaje się najlepsze.IF NOT "%ARG:~0,2%" == "--"
.SHIFT
gdy używasz jednego z parametrów.SET FOO=%DEFAULT_FOO%
można żałować, ale alternatywą byłoby dodanie blokuIF "%FOO%" == "" SET FOO=%DEFAULT_FOO%
zewnętrznegoIF NOT "%ARG%" == ""
. Jednak ponieważ jest to nadal wewnątrzIF "%PARAM%" == "--foo"
blokiem, przy czym%FOO%
wartość byłaby oceniana i ustawić przed kiedykolwiek wszedł do bloku, więc nigdy nie będzie wykryć, że zarówno--foo
parametr był obecny , a także , że%FOO%
wartość brakowało.ECHO Missing bar value. 1>&2
wysyła komunikat o błędzie do stderr.ECHO:
lub jednej z odmian.źródło
Utwórz nowy plik wsadowy (przykład: openclass.bat) i zapisz ten wiersz w pliku:
Następnie umieść plik wsadowy, powiedzmy, w folderze system32, przejdź do pliku klasy Java, kliknij prawym przyciskiem myszy, Właściwości, Otwórz za pomocą ..., a następnie znajdź plik wsadowy, wybierz go i to tyle ...
Mi to pasuje.
PS: Nie mogę znaleźć sposobu na zamknięcie okna cmd, kiedy zamykam klasę Java. Na razie...
źródło
start /wait java %~n1
Proste rozwiązanie (mimo że pytanie jest stare)
Test1.bat
CallTest1.bat
wynik
Gdzie YourLocalPath jest bieżącą ścieżką do katalogu.
Dla uproszczenia przechowuj parametr polecenia w zmiennej i używaj zmiennej do porównania.
Jest nie tylko prosty w pisaniu, ale również łatwy w utrzymaniu, więc jeśli później ktoś inny lub po dłuższym czasie przeczytasz skrypt, będzie on łatwy do zrozumienia i utrzymania.
Aby napisać kod inline: zobacz inne odpowiedzi.
źródło
Obs: Do użytku bez:
?*&<>
źródło
?*&<>