ไฟล์แบตช์ของ Windows มีโครงสร้าง *% หรือไม่


คำตอบ:


10

ไฟล์แบตช์ Windows (ตั้งแต่ Windows XP แต่อาจเป็นไปได้ก่อนหน้านี้) รองรับการ%*สร้างซึ่งประเมินพารามิเตอร์ทั้งหมดจาก% 1 เป็นต้นไป

น่าเสียดายที่นี่ไม่เคารพSHIFTคำสั่งดังนั้นสิ่งต่อไปนี้จะไม่ทำงาน:

@echo off
set EATEN=%1
shift

call other.bat %*

มันจะยังคงผ่านพารามิเตอร์แรกไปยังไฟล์ชุดที่สอง


2
หมายเหตุ: %*รักษาช่องว่าง / คำพูด
Aaron Digulla

10

คุณสามารถรวบรวม args ทั้งหมดเข้าด้วยกันโดยใช้สิ่งที่ชอบ:

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

:done
(use %args% here)

วิธีนี้ใช้งานได้โดยไม่คำนึงว่ามีอาร์กิวเมนต์เท่าใด


2

หากคุณต้องการข้ามพารามิเตอร์ 3 ตัวแรกตัวอย่างเช่นและผ่านส่วนที่เหลือ:

@echo off
for /f "tokens=1-3*" %%a in ("%*") do (
   set par1=%%a
   set par2=%%b
   set par3=%%c
   set therest=%%d
   )

call other.bat %therest%

อาจมีปัญหากับคำพูดในพารามิเตอร์

รุ่งโรจน์ถึง Patrick Cuff, /programming/382587/how-to-get-batch-file-parameters-from-nth-position-on


1

ใช่.

คุณสามารถเขียนตัวอย่างของคุณดังนี้:

@echo off
call other.bat %*

นอกจากนี้: การเปลี่ยนแปลงการสนับสนุนบน Windows ... ดูนี้
แต่แท้จริงแล้วลิงค์สุดท้ายยืนยันว่าการเปลี่ยนแปลงไม่ทำงานร่วมกับ% *:

•การใช้% * พร้อมshift
  shiftไม่มีผลกับพารามิเตอร์ชุด%%


ขออภัยลิงค์ไม่ดี ... ควรได้รับการแก้ไขในขณะนี้
fretje

(quote) การใช้% * พร้อม shift shift ไม่มีผลกับพารามิเตอร์ชุด% * (/ quote)
Wedge

ทำไมต้องลงคะแนน? คำถามเกี่ยวกับ% * ไม่เกี่ยวกับการเปลี่ยนแปลง
fretje

คำตอบแรกของคุณมีเพียง "ใช่พวกเขาทำ" ซึ่งไม่ใช่ลิงก์ที่ชัดเจน (หรือคำตอบ) แก้ไขครั้งสุดท้ายของคุณมากขึ้นของคำตอบที่ดีอาจจะว่าทำไม ...
Thijs

อันที่จริง downvote เกิดขึ้นหลังจากที่ฉันเพิ่มคำอธิบายเพิ่มเติม และผมเห็นว่าการเชื่อมโยงที่ "ใช่พวกเขา" ไม่ชัดเจน แต่มันก็เป็นคำตอบที่แน่นอนสำหรับคำถามที่อยู่ในมือ ...
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

รักษาตัวคั่นพิเศษทั้งหมด รองรับพารามิเตอร์ให้มากที่สุดเท่าที่จะสามารถติดตั้งได้ด้วยอักขระ 8175 ตัวต่อขีด จำกัด บรรทัดคำสั่ง (รวมถึงชื่อไฟล์แบตช์ CRLF และเส้นทางแบทช์หากระบุ) พารามิเตอร์สามารถจัดกลุ่มด้วยเครื่องหมายคำพูดคู่ (เช่น "sw1 = / เงียบ / ข้าม: 1 / start = 3") หมายเหตุ: เครื่องหมายคำพูดคู่จะถูกสงวนไว้ คาดว่าพฤติกรรมของอัญประกาศคู่ (แม้ว่าจะใช้ไม่ถูกต้องเช่นใช้เพียงอย่างเดียวหรือ "" หรือ "") โปรดแก้จุดบกพร่องรหัสก่อนที่จะทำการรายงานข้อผิดพลาด
ธรรมะ Leonardi

นั่นเป็นคำตอบที่ซับซ้อนมากซึ่งแสดงข้อมูลการดีบักจำนวนมากถึงแม้ว่ามันจะไม่ตอบคำถามเดิมโดยตรง: ทำอย่างไรcall other.batกับพารามิเตอร์ที่กำหนด :( ฉันจะเขียน "other.bat" ที่ไหนฉันสามารถลบ "Parameter index (es) เพื่อแยก "แบบสอบถามหรือclsไม่ไม่จำเป็นต้องใช้ในการแก้ปัญหาขั้นสุดท้าย
izogfif
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.