2012-03-28 26 views
5

Tôi có một cửa sổ tập tin batch để chấp nhận một mật khẩu như người dùng nhập vào:thoát đầu vào người sử dụng trong cửa sổ tập tin batch

SET /P PASSWORD=Password: 

Mật khẩu này có thể có nhân vật mà không cần thoát như !. Các PASSWORD biến sau đó được truyền cho các tập tin batch khác sử dụng CALL

CALL Foo.Bat %PASSWORD% 

Làm thế nào tôi có thể đảm bảo rằng các nhân vật đặc biệt được thoát và thông qua một cách chính xác như tham số? Ví dụ: nếu người dùng nhập !%"£$" Tôi muốn %1!%"£$" trong Foo.bat.

Trả lời

2

Đó 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 # %* # 
+0

Cảm ơn, mà giải quyết vấn đề :). – briantyler

+0

Hoặc 'Echo!% ~ 1!' Vì tên của biến được chuyển thành tham số. – dbenham

+0

@ dbenham- vâng đó là ý định của tôi, nhưng tôi đã quên nó khi viết :-) – jeb

Các vấn đề liên quan