Meneruskan Parameter Bernama ke Batch Script dengan Karakter Khusus
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 FILEPATH
tidak 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 argcount
untuk menghubungkan posisi alfanumerik set %%x
baris?
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
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=Somepath
itu 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
)
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 FILEPATH
argumen posisional, tetapi karena batch memiliki batasan dalam menggunakan saja, %1-->%9
saya merasa paling mudah / terbaik untuk menangani / mengizinkannya FILEPATH
menjadi 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.cmd
akan 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 . . .