Đó là một thử thách tuyệt vời, nhưng đây là kỹ thuật hàng loạt nâng cao.
Tôi sẽ sử dụng ở đây một cách đơn giản hơn, sử dụng mở rộng trễ và không gửi nội dung, chỉ tên biến.
Điều này tuyệt đối an toàn ngay cả với các ký tự đặc biệt.
call foo.bat password
Foo.bat -----------------
Setlocal EnableDelayedExpansion
Echo !password!
EDIT: Giải đáp cho câu hỏi ban đầu,
đây là một cách để giải quyết bằng nội dung thay vì tên biến
Cần chuẩn bị nội dung trước khi gửi qua CALL tới tệp hàng loạt thứ hai.
Thật khó để sử dụng một cái gì đó giống như CALL foo.bat %preparedVariable%
Nó có vẻ là tốt hơn để sử dụng CALL foo.bat !preparedVariable!
Nhưng thậm chí sau đó tôi thất bại tại tăng gấp đôi dấu mũ bởi CALL-pha.
Nhưng sau đó tôi tìm thấy một cách đơn giản để sử dụng phần trăm mở rộng ngay sau giai đoạn CALL.
@echo off
setlocal DisableDelayedExpansion
rem set /p "complex=Complex Input "
set "complex=xx! & "!^&"ab^^ " ^^^^cd%%"
setlocal EnableDelayedExpansion
call :prepareForCallBatch complex PreparedParam
echo Send =!PreparedParam!#
set complex
echo(
call ShowParam.bat %%PreparedParam%%
exit /b
:: Prepare special characters &|<>"^ for a batch call
:prepareForCallBatch
set "temp=!%~1!"
set "temp=!temp:^=^^!"
set "temp=!temp:&=^&!"
set "temp=!temp:|=^|!"
set "temp=!temp:<=^<!"
set "temp=!temp:>=^>!"
set "temp=!temp:"=^^"!"
set "%~2=!temp!"
exit /b
Để xem thực tham số trong ShowParam.bat tôi sử dụng một cái gì đó như thế này
ShowParam.bat
@echo off
setlocal
set prompt=
@echo on
REM # %* #
Cảm ơn, mà giải quyết vấn đề :). – briantyler
Hoặc 'Echo!% ~ 1!' Vì tên của biến được chuyển thành tham số. – dbenham
@ dbenham- vâng đó là ý định của tôi, nhưng tôi đã quên nó khi viết :-) – jeb