Các tệp bó Windows có cấu trúc% * không?


Câu trả lời:


10

Các tệp bó của Windows (kể từ Windows XP, nhưng có thể sớm hơn) hỗ trợ %*cấu trúc, ước tính cho tất cả các tham số từ% 1 trở đi.

Thật không may, điều này không tôn trọng SHIFTlệnh, vì vậy những điều sau đây sẽ không hoạt động:

@echo off
set EATEN=%1
shift

call other.bat %*

Nó vẫn sẽ chuyển tham số đầu tiên vào tệp bó thứ hai.


2
Lưu ý: %*giữ nguyên khoảng trắng / dấu ngoặc kép.
Aaron Digulla

10

Bạn có thể tập hợp tất cả các đối số lại với nhau bằng cách sử dụng một cái gì đó như:

set args=%1
shift
:start
if [%1] == [] goto done
set args=%args% %1
shift
goto start

:done
(use %args% here)

Điều này hoạt động bất kể có bao nhiêu đối số.



1

Có họ làm.

Bạn có thể viết ví dụ của bạn như sau:

@echo off
call other.bat %*

Ngoài ra: sự thay đổi được hỗ trợ trên windows ... Xem này .
Nhưng thực tế, liên kết cuối cùng đó xác nhận rằng ca làm việc không hoạt động kết hợp với% *:

• Sử dụng% * với shift
  Shift không ảnh hưởng đến tham số lô% *.


Xin lỗi liên kết là xấu ... nên được sửa chữa ngay bây giờ.
fretje

(trích dẫn) Sử dụng% * với thay đổi Shift không ảnh hưởng đến tham số lô% *. (/ quote)
Wedge

Tại sao các downvote? Câu hỏi là về% * không phải về ca.
Fretje

Câu trả lời đầu tiên của bạn chỉ có "Có họ làm" không phải là một liên kết rõ ràng (hoặc câu trả lời). Bản chỉnh sửa cuối cùng của bạn không chỉ là một câu trả lời hay, có lẽ đó là lý do ...
thijs

Trên thực tế, downvote đã xảy ra sau khi tôi thêm giải thích. Và tôi đồng ý rằng liên kết về "Có họ làm" không rõ ràng, nhưng đó là một câu trả lời chính xác cho câu hỏi trong tay ...
fretje

0
@echo off
cls
setlocal enabledelayedexpansion

:: Disable the display of information by changing [set "_ENABLE_INFO="] to [set "_ENABLE_INFO=::"].
set "_ENABLE_INFO="
set _DBQ="

set "_PARMS.ORIGINAL=%*" && if defined _PARMS.ORIGINAL (
   if not defined _PARMS.IDX (
      echo Parameter Index^(es^) to extract eg.:
      echo 1 2 5 9 11 39 400
      set /p "_PARMS.IDX=>"
   )
   set "_PARMS.IDX=¡!_PARMS.IDX: =¡ ¡!¡"
   set "_PARMS.IDX=!_PARMS.IDX:¡¡=!"
   set "_PARMS.IDX=!_PARMS.IDX: =!"
   call :_FN_PROC.STRING %*
%_ENABLE_INFO% goto :FINISH
   goto :eof
) else (
   echo No input parameters.
)
goto :eof


:_FN_PROC.STRING
set "_PARMS.PROCESS.STRING=%*"
:_FN_PROC.STRING.LOOP
set "_PARMS.PROCESS.STRING=!_PARMS.PROCESS.STRING:%_DBQ%=¡!"
set /a _PARMS.COUNT+=1
for /f "tokens=1* delims= " %%a in ("!_PARMS.PROCESS.STRING!") do (
   set _PARMS.TMP.CHECK=%%a
   set _PARMS.PROCESS.STRING=%%b
   if "!_PARMS.TMP.CHECK!" NEQ "!_PARMS.TMP.CHECK:¡=!" (
      for /f "tokens=1* delims=¡" %%c in ("%%a !_PARMS.PROCESS.STRING!") do (
         set _PARMS.TMP.CHECK="%%c"
         set _PARMS.PROCESS.STRING=%%d
      )
   )
)

if "!_PARMS.IDX:¡%_PARMS.COUNT%¡=!" EQU "!_PARMS.IDX!" (
   set _PARMS.REMAINING=!_PARMS.REMAINING! !_PARMS.TMP.CHECK!
   set _PARMS.IDX=!_PARMS.IDX!{%_PARMS.COUNT%}
) else (
   set _PARMS.EXTRACTED=!_PARMS.EXTRACTED! !_PARMS.TMP.CHECK!
   set _PARMS.IDX=!_PARMS.IDX:¡%_PARMS.COUNT%¡=!
   set _PARMS.IDX=!_PARMS.IDX![%_PARMS.COUNT%]
)

if "!_PARMS.PROCESS.STRING: =!"=="" (set _PARMS.PROCESS.STRING=)
if defined _PARMS.PROCESS.STRING (goto :_FN_PROC.STRING.LOOP)

set _DBQ=
set _PARMS.TMP.CHECK=
if defined _PARMS.REMAINING (set _PARMS.REMAINING=!_PARMS.REMAINING:~1!)
if defined _PARMS.EXTRACTED (set _PARMS.EXTRACTED=!_PARMS.EXTRACTED:~1!)
goto :eof


:FINISH
echo.
echo _PARMS.IDX ^:
echo    ¡^=¡ no Parameter Index was specified for extraction.
echo    ¡n¡ nth Parameter was not processed (Index larger than Parameters Count).
echo    [n] nth Parameter was Extracted.
echo    {n} nth Parameter was Ignored (Remaining).
echo.
set _
goto :eof

Bảo tồn tất cả các dấu phân cách đặc biệt. Hỗ trợ càng nhiều Tham số càng tốt trong giới hạn 8175 ký tự cho mỗi dòng lệnh (bao gồm tên tệp bó, CRLF và đường dẫn lô nếu được chỉ định). Các tham số có thể được nhóm với dấu ngoặc kép (ví dụ: "sw1 = / quiet / Skip: 1 / start = 3"). Lưu ý: Báo giá kép được bảo tồn. Hành vi của dấu ngoặc kép được mong đợi (ngay cả khi được sử dụng không chính xác, ví dụ: chỉ được sử dụng đơn lẻ hoặc "" hoặc ""). Vui lòng gỡ lỗi mã trước khi thực hiện báo cáo lỗi.
Pháp Leonardi

Đó là câu trả lời rất công phu hiển thị nhiều thông tin gỡ lỗi, mặc dù nó không trả lời trực tiếp câu hỏi ban đầu: làm thế nào call other.batvới các tham số đã cho :( Tôi viết "other.bat" ở đâu? "truy vấn? Ngoài ra, clskhông cần thiết trong giải pháp cuối cùng.
izogfif
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.