Tóm tắt TL; DR: sử dụng net usevàif exist
Tôi gặp phải một vấn đề liên quan trong khi tạo ra một kịch bản sao lưu hàng đêm. Nó phải kiểm tra xem máy tính đã được bật chưa (sử dụng ping), gửi gói ma thuật để bật nếu cần (sử dụng MC-WOL ), đợi Windows khởi động, sau đó thiết lập kết nối với chia sẻ SMB và chờ đợi hiện tại.
Mặc dù các câu trả lời khác ở đây rất hay, tôi không muốn các ký tự ổ đĩa được ánh xạ xuất hiện hoặc không kết nối bất cứ thứ gì mà người dùng có thể làm việc cùng, cũng như không có cửa sổ Explorer nhấp nháy xung quanh. tức là mục tiêu không làm người dùng mất tập trung .
Đây là một đoạn mã có thể hữu ích cho bạn:
set TARGET_IP=192.168.1.3
set TARGET_PATH=\\%TARGET_IP%\d$\backups
set ATTEMPTS=0
:LOOP
REM Give up eventually
if %ATTEMPTS% GEQ 200 goto NOJOY
REM Wait for IP connectivity to host, and/or burn up a couple seconds before retry
ping -n 1 -w 2000 %TARGET_IP% | find "TTL" > nul
if errorlevel 1 set /a ATTEMPTS+=1 & goto LOOP
REM See if we're already connected, and try to give it a kick
if exist %TARGET_PATH% goto CONNECTED
REM Try to reconnect
net use %TARGET_PATH% > nul
if errorlevel 1 set /a ATTEMPTS+=1 & goto LOOP
:CONNECTED
echo Connected
exit /b
:NOJOY
echo Couldn't connect
Nếu bạn thích, bạn có thể thay thế địa chỉ IP ở trên bằng tên máy chủ (ví dụ server1).
net uselà cần thiết trong trường hợp không có kết nối hiện có. Tôi đã gặp một số trường hợp ở góc mà chỉ một mình nó dường như không đủ để "đánh thức" phần chia sẻ (ví dụ nếu có một kết nối trước đó tồn tại ở trạng thái ngắt kết nối). Tôi tìm thấy if existschỉ có tác dụng tương tự như các lựa chọn thay thế đề cập trong câu trả lời khác (như pushd, dir, Explorer, vv), nhưng nó dường như là một cách tiếp cận trọng lượng nhẹ hơn.