Meneruskan Parameter Bernama ke Batch Script dengan Karakter Khusus

Aug 20 2020

Saya menemukan dan memodifikasi potongan kode untuk memungkinkan melewatkan parameter bernama tak terbatas ke skrip batch.

Mengakses jumlah perintah (parameter) yang tidak diketahui dalam file batch

Semuanya bekerja dengan baik, tetapi sekarang saya sedang membangun di Wildcard untuk memeriksa skrip dan saya menemukan jika saya meneruskan nilai seperti ini "FILEPATH=C:\tmp\test *.txt"yang FILEPATHtidak ditentukan oleh cuplikan kode saya. Karena saya tidak benar-benar membuatnya, saya sebagian tidak menyadari cara kerjanya dan dapat dimodifikasi untuk memungkinkan karakter khusus.

Berikut adalah cuplikan kode untuk mengizinkan params bernama yang saya ingin panduan tentang modifikasi:

::Set Named Arguments
set argCount=0
for %%x in (%*) do (
   set /A argCount+=1
   set "argVec[!argCount!]=%%~x"
   set %%x
)

Memperbarui:

Saya mengubah for loop menjadi for /F delims^=^"^ tokens^=* %%x in (%*) do (dan sekarang akan mendefinisikan FILEPATH dengan WILDCARD, tetapi ini menghapus yang pertama "dan kemudian membuat semua argumen menjadi satu baris dan juga menghapus yang terakhir ". Mungkin saya memerlukan cara untuk menggunakan argcountuntuk menghubungkan posisi alfanumerik set %%xbaris?

Pemikiran lain, karena perubahan di atas ke perulangan for tidak menerima wildcard, tetapi membuat satu variabel panjang yang berisi semua parameter yang diteruskan script.cmd, mungkin saya bisa mengulanginya (variabel panjang) lagi dan membagi argumen bernama.

Memperbarui:

Contoh penggunaan:

script.cmd:

@ECHO OFF
CLS
::Set Named Arguments
set argCount=0
for %%x in (%*) do (
   set /A argCount+=1
   set "argVec[!argCount!]=%%~x"
   set %%x
)
ECHO %FILEPATH%
ECHO %VAR%
EXIT /B

test.cmd:

@ECHO OFF
CLS

::Doesn't Work
CALL "C:\tmp\script.cmd" "FILEPATH=C:\tmp\tes*.txt" "VAR=2"
PAUSE
::Works Fine
CALL "C:\tmp\script.cmd" "FILEPATH=C:\tmp\test.txt" 
PAUSE

Jawaban

1 Gerhard Aug 20 2020 at 07:25

Menggunakan metode Anda saat ini dengan mendefinisikan FILEPATH=sebagai parameter.

Catatan: Saya perlu menyatakan bahwa tren ini sedikit berbahaya. Alasannya, jika salah satu variabel input berisi sesuatu seperti PATH=Somepathitu akan merusak lingkungan langsung saat skrip sedang berjalan. Jadi pastikan Anda memeriksa jenis input yang akan diteruskan.

@echo off & setlocal enabledelayedexpansion
(set "%~1" & set "%~2" & set "%~3" & set "%~4")>nul
set argCount=0
if defined FILEPATH (
  for %%x in ("%FILEPATH%") do (
     set /A argCount+=1
     set "argVec[!argCount!]=%%~x"
     echo argVec[!argCount!]
 )
 echo %FILEPATH%
) else (
 echo FILEPATH not defined
)
FreeSoftwareServers Aug 20 2020 at 16:34

Solusi lengkap saya berdasarkan jawaban mengagumkan @ Gerhard. Ini masih memungkinkan saya untuk mengambil input variabel dalam jumlah tidak terbatas dalam "VALUE=KEY"format yang tidak diketahui, dan tidak mengetahui FILEPATHargumen posisional, tetapi karena batch memiliki batasan dalam menggunakan saja, %1-->%9saya merasa paling mudah / terbaik untuk menangani / mengizinkannya FILEPATHmenjadi salah satu dari 9 pertama PARAMS. Ini benar-benar mengajari saya tentang hal-hal yang Anda anggap remeh dalam cangkang seperti BASH dan juga, apa yang dilakukan BASH "di balik layar". Idenya adalah untuk membangun pencarian wildcard karena saya script.cmdakan selalu dipanggil oleh "skrip induk" w / params dan saya ingin itu serupa dengan BASH(izinkan pengguna akhir untuk menggunakan wildcard).

script.cmd:

@ECHO OFF
CLS
::SET Named Arguments
SET argCount=0
for %%x in (%*) do (
   SET /A argCount+=1
   SET "argVec[!argCount!]=%%~x"
   SET %%x
)

::Wildcards in FilePath?
(SET "%~1" & SET "%~2" & SET "%~3" & SET "%~4" & SET "%~5" & SET "%~6" & SET "%~7" & SET "%~8" & SET "%~9")>nul
SET argCount=0
IF DEFINED FILEPATH (
  FOR %%x IN ("%FILEPATH%") DO (
     SET /A argCount+=1
     SET "argVec[!argCount!]=%%~x"
 )
 CALL :FindFileWildCard "%FILEPATH%" FILEPATH
) ELSE (
   ECHO No "FILEPATH=C:\path\print.doc" Defined!
   PAUSE
   GOTO:EOF
)

ECHO %FILEPATH%
ECHO %VAR%
ECHO %VAR2%
ECHO %VAR3%
ECHO %VAR4%
ECHO %VAR5%
ECHO %VAR6%
ECHO %VAR7%
ECHO %VAR8%
ECHO %VAR9%
ECHO %VAR10%
GOTO :EOF

::Functions
:FindFileWildCard
::Does Path contain WildCards?
ECHO "%~1" | FIND /i "*" >nul
IF %ERRORLEVEL% EQU 0 (
 FOR /F "Tokens=*" %%F IN ('DIR /B /S "%~1"') DO (
 SET %2=%%F
 EXIT /B
 )
)
ECHO "%~1" | FIND /i "?" >nul
IF %ERRORLEVEL% EQU 0 (
 FOR /F "Tokens=*" %%F IN ('DIR /B /S "%~1"') DO (
 SET %2=%%F
 EXIT /B
 )
)
EXIT /B

:EOF

test.cmd:

@ECHO OFF
CLS

CALL "C:\tmp\script.cmd" "VAR=VAR" "VAR2=VAR2" "VAR3=VAR3" "FILEPATH=C:\tmp\tmp space\te*.txt"  "VAR4=VAR4" "VAR5=VAR5" "VAR6=VAR6" "VAR7=VAR7" "VAR8=VAR8" "VAR9=VAR9" "VAR10=VAR10"
PAUSE
CALL "C:\tmp\script.cmd" "VAR=VAR" "VAR2=VAR2" "VAR3=VAR3" "FILEPATH=C:\tmp\tmp space\test with spa?*.txt"  "VAR4=VAR4" "VAR5=VAR5" "VAR6=VAR6" "VAR7=VAR7" "VAR8=VAR8" "VAR9=VAR9" "VAR10=VAR10"
PAUSE
CALL "C:\tmp\script.cmd" "VAR=VAR" "VAR2=VAR2" "VAR3=VAR3" "FILEPATH=C:\tmp\test.txt"  "VAR4=VAR4" "VAR5=VAR5" "VAR6=VAR6" "VAR7=VAR7" "VAR8=VAR8" "VAR9=VAR9" "VAR10=VAR10"
PAUSE

Hasil:

C:\tmp\tmp space\test with space.txt
VAR
VAR2
VAR3
VAR4
VAR5
VAR6
VAR7
VAR8
VAR9
VAR10
Press any key to continue . . .