Windows komut satırında toplu iş dosyalarında parametreleri kullanma


161

Windows'ta, bir toplu iş dosyası çalıştırıldığında iletilen bağımsız değişkenlere nasıl erişirsiniz?

Örneğin, adında bir programım olduğunu varsayalım hello.bat. Bir hello -aWindows komut satırına girdiğimde , programımın -aargüman olarak aktarıldığını nasıl bilebilirim ?


Komut satırı parametreleri bir toplu iş dosyasına nasıl
aktarılır

3
"DOS komut satırından" bahsediyor.
David R Tribble

Yanıtlar:


287

Diğerleri zaten söylediler, komut satırına geçirilen parametreler gösterimi ile toplu dosyalarında erişilebilir %1için %9. Kullanabileceğiniz iki simge daha vardır:

  • %0bir komut hattı belirtildiği gibi yürütülebilir (parti dosya) adı .
  • %*olduğu komut satırında belirtilen tüm parametreler - başka bir programa parametre iletmek istiyorsanız bu çok kullanışlıdır.

Ayrıca, parametrelere nasıl erişileceğinin yanı sıra dikkat edilmesi gereken birçok önemli teknik vardır.

Bir parametrenin iletilip iletilmediğini kontrol etme

Bu, IF "%~1"==""ancak hiçbir argümanın geçilmemesi durumunda doğrudur. Çevresindeki tırnak işaretlerinin değerinden kaldırılmasına neden olan tilde karakterine dikkat edin %1; tilde olmadan, sözdizimi hataları olasılığı da dahil olmak üzere çift tırnak işareti içeriyorsa beklenmedik sonuçlar alırsınız.

9'dan fazla argümanı ele almak (ya da sadece hayatı kolaylaştırmak)

9'dan fazla bağımsız değişkene erişmeniz gerekiyorsa, komutu kullanmanız gerekir SHIFT. Bu komut kaymalar bir yerde tüm argümanlar değerlerini, böylece %0değerini alır %1, %1değerini alır %2, vb %9çağırmadan önce herhangi bir değişken yoluyla mevcut değildi ki, (eğer mevcutsa) onuncu argüman değerini alır SHIFT(girmek komutaSHIFT /? ).

SHIFTbelirli bir sırada sunulmasını gerektirmeden parametreleri kolayca işlemek istediğinizde de yararlıdır. Örneğin, bir komut dosyası bayrakları -ave -bherhangi bir sırayla tanıyabilir . Bu gibi durumlarda komut satırını ayrıştırmanın iyi bir yolu

:parse
IF "%~1"=="" GOTO endparse
IF "%~1"=="-a" REM do something
IF "%~1"=="-b" REM do something else
SHIFT
GOTO parse
:endparse
REM ready for action!

Bu şema deli olmadan oldukça karmaşık komut satırlarını ayrıştırmak için izin verir.

Toplu parametrelerin değiştirilmesi

Dosya adlarını temsil eden parametreler için kabuk, başka hiçbir şekilde erişilemeyen dosyalarla çalışmakla ilgili birçok işlevsellik sağlar. Bu işleve, ile başlayan yapılarla erişilir %~.

Örneğin, bağımsız değişken olarak aktarılan dosyanın boyutunu almak için

ECHO %~z1

Toplu iş dosyasının başlatıldığı dizinin yolunu almak için (çok yararlı!)

ECHO %~dp0

CALL /?Komut istemine yazarak bu özelliklerin tamamını görebilirsiniz .


4
: Ayrıştırma,: endparse yapı, GOTO ile bile güzelliktir. Teşekkürler! (Yani, DOS-BASIC zorla GOTO)
mmrtnt

1
BAT güç kabuğundan çağrıldığında bu teknik başarısız olabilir. Gibi bir alıntı exe sırasında "name=John"olacak name John. Bir çözüm tek tırnak işareti ile çevrelenmektir,'"name=John"'
cmcginty

1
Nasıl olmadan bu kadar uzun gitti CALL /?!? Burada Google ile her zaman çarpıştım.
bigtlb

@Jon cmd yoluyla çağırırsam sadece bir kod yankı% 1 içeren yarasa dosyası yazdım, örneğin xx.bat & parametre> "C: \ yy.txt" yarasa dosyasını parametre ile çağırıyor ve txt dosyasına yazıyorum ama parametresinin başında veya sonunda çalışmaz. Başka herhangi bir metin iyi çalışıyor.
Alex Mathew

56

Toplu iş dosyalarında parametreleri kullanma:% 0 ve% 9

Toplu iş dosyaları tokens: %0to ile parametre olarak iletilen sözcüklere başvurabilir %9.

%0 is the program name as it was called.
%1 is the first command line parameter
%2 is the second command line parameter
and so on till %9.

komut satırına iletilen parametreler alfasayısal karakterler olmalı ve boşluklarla sınırlandırılmalıdır. Yana %0bu adıyla programı adıdır DOS %0açılış sırasında başladıysanız AUTOEXEC.BAT için boş olacaktır.

Misal:

Aşağıdaki komutu, şu toplu iş dosyasına koyun mybatch.bat:

@echo off
@echo hello %1 %2
pause

Toplu iş dosyasını şu şekilde çağırmak: mybatch john billyoutput:

hello john billy

Bir toplu iş dosyası için 9'dan fazla parametre alın, kullanın:% *

Yüzde Yıldız belirteci %*"parametrelerin geri kalanı" anlamına gelir. Burada tanımlandığı gibi onları yakalamak için bir for döngüsü kullanabilirsiniz:

http://www.robvanderwoude.com/parameters.php

Toplu iş parametreleri için sınırlayıcılar hakkında notlar

Komut satırı parametrelerindeki bazı karakterler, DOS sürümüne bağlı olarak, "kaçarsalar mı, kalmazlarsa" ve genellikle komut satırındaki konumlarına bağlı olarak, toplu iş dosyaları tarafından yok sayılır:

commas (",") are replaced by spaces, unless they are part of a string in 
double quotes

semicolons (";") are replaced by spaces, unless they are part of a string in 
double quotes

"=" characters are sometimes replaced by spaces, not if they are part of a 
string in double quotes

the first forward slash ("/") is replaced by a space only if it immediately 
follows the command, without a leading space

multiple spaces are replaced by a single space, unless they are part of a 
string in double quotes

tabs are replaced by a single space

leading spaces before the first command line argument are ignored

5

Toplu İş Dosyaları, atanacak değişkenler olduğu sürece programdan sonra metni otomatik olarak iletir. Gönderildikleri sırayla iletilirler; ör.% 1, program çağrıldıktan sonra gönderilen ilk dize vb. olacaktır.

Hello.bat'a sahipseniz ve içindekiler:

@echo off
echo.Hello, %1 thanks for running this batch file (%2)
pause

ve komutu toplu olarak

hello.bat APerson241% tarih%

bu mesajı geri almalısınız:

Merhaba, APerson241 Bu toplu iş dosyasını çalıştırdığınız için teşekkürler (01/11/2013)


4

@ Jon's :parse/:endparse şeması harika bir başlangıç ​​ve ilk geçiş için minnettarlığım var, ancak Windows haksız parti sisteminin sizi bu kadar kolay bırakacağını düşünüyorsanız… iyi, arkadaşım, şok içindesiniz. Bütün günü bu şeytanlıkla geçirdim ve çok acı verici araştırma ve denemelerden sonra nihayet gerçek bir yaşam için uygun bir şey başardım.

Bir yardımcı program uygulamak istediğimizi söyleyelim foobar. Bir başlangıç ​​komutu gerektirir. İsteğe bağlı bir değer --fooalan isteğe bağlı bir parametreye sahiptir (elbette başka bir parametre olamaz); değer eksikse varsayılan değerdir . Ayrıca, gerekli bir değeri alan isteğe bağlı bir parametreye sahiptir . Son olarak , hiçbir değere izin verilmeyen bir bayrak alabilir . Oh, ve bu parametreler herhangi bir sırada gelebilir.default--bar--baz

Başka bir deyişle, şöyle görünür:

foobar <command> [--foo [<fooval>]] [--bar <barval>] [--baz]

Karmaşık? Hayır, bu gerçek yaşam araçları için oldukça tipik görünüyor. ( gitkimse?)

Daha fazla uzatmadan, işte bir çözüm:

@ECHO OFF
SETLOCAL
REM FooBar parameter demo
REM By Garret Wilson

SET CMD=%~1

IF "%CMD%" == "" (
  GOTO usage
)
SET FOO=
SET DEFAULT_FOO=default
SET BAR=
SET BAZ=

SHIFT
:args
SET PARAM=%~1
SET ARG=%~2
IF "%PARAM%" == "--foo" (
  SHIFT
  IF NOT "%ARG%" == "" (
    IF NOT "%ARG:~0,2%" == "--" (
      SET FOO=%ARG%
      SHIFT
    ) ELSE (
      SET FOO=%DEFAULT_FOO%
    )
  ) ELSE (
    SET FOO=%DEFAULT_FOO%
  )
) ELSE IF "%PARAM%" == "--bar" (
  SHIFT
  IF NOT "%ARG%" == "" (
    SET BAR=%ARG%
    SHIFT
  ) ELSE (
    ECHO Missing bar value. 1>&2
    ECHO:
    GOTO usage
  )
) ELSE IF "%PARAM%" == "--baz" (
  SHIFT
  SET BAZ=true
) ELSE IF "%PARAM%" == "" (
  GOTO endargs
) ELSE (
  ECHO Unrecognized option %1. 1>&2
  ECHO:
  GOTO usage
)
GOTO args
:endargs

ECHO Command: %CMD%
IF NOT "%FOO%" == "" (
  ECHO Foo: %FOO%
)
IF NOT "%BAR%" == "" (
  ECHO Bar: %BAR%
)
IF "%BAZ%" == "true" (
  ECHO Baz
)

REM TODO do something with FOO, BAR, and/or BAZ
GOTO :eof

:usage
ECHO FooBar
ECHO Usage: foobar ^<command^> [--foo [^<fooval^>]] [--bar ^<barval^>] [--baz]
EXIT /B 1

Evet, gerçekten bu kadar kötü. Benzer mesajımı https://stackoverflow.com/a/50653047/421049 adresinde görebilirsiniz , burada mantıkta neler olup bittiğini ve neden belirli yapıları kullandığımı daha fazla analiz ediyorum.

İğrenç. Çoğu bugün öğrenmek zorunda kaldım. Ve acıttı.


3

Kullanım değişkenler yani .BATdeğişkenler ve denilen %0için%9

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.