Показать полную графическую версию : [решено] Ошибка работы скрипта (Непредвиденное появление: and)
sunnykey
20-02-2012, 07:13
Здравствуйте, написал батник такого содержания:
title TimeSync
if "%1"=="" (goto :error)
reg import %1
net stop w32time && net start w32time
w32tm /resync /rediscover
echo Start time test
rem Ip-адрес является эталоном времени (то есть с кем сравнивать)
rem делаем 4 сравнения
w32tm /stripchart /computer:192.168.1.1 /samples:4
echo End
goto :last
:error echo No reg file was accpted!
:last pause
Через параметр подаётся файл реестра. Если запустить без параметров, скрипт отработает как положено. Однако при запуске с reg-файлом, вываливается ошибка
Непредвиденное появление: and
В чём ошибка?
P.S. Без if скритп правильно работает
DesmondTruman
20-02-2012, 13:10
Непредвиденное появление: and
if "%1"=="" (goto :error) тут уберите кавычки с %1. А когда будете ему передовать путь\файл реестра, передовайте в кавычках.
К примеру:
C:\Documents and Settings\admin>TimeSync.bat "C:\Documents and Settings\admin\Рабочий стол\import.reg"
if "%1"=="" (goto :error) тут уберите кавычки с %1. »
Неправильный подход. Кавычки тут нужны и обязательны. Просто нужно приучиться использовать не просто кавычки «"%1"», а «"%~1"».
А для проверки факта, был ли передан параметр (плюс — проверки существования, если это путь) я предпочитаю использовать иной подход:
@echo off
setlocal enableextensions enabledelayedexpansion
set sParam=%~1
if defined sParam (
if exist "%sParam%" (
echo Working here with parameter [%sParam%]
) else (
echo Path [%sParam%] not found
)
) else (
echo Usage: "%~nx0" ^<Path to file^>
)
endlocal
exit /b 0
sunnykey
21-02-2012, 03:46
Неправильный подход. Кавычки тут нужны и обязательны. Просто нужно приучиться использовать не просто кавычки «"%1"», а «"%~1"». »
Без кавычек программа отработала правильно. Возникает сразу вопрос: зачем нужна тильда? Я скрипты учусь писать по книжке Станека, там почему-то я не увидел, чтобы он у параметров тильду ставил. Прошу объяснить, либо ссылку дать где это прописано.
sunnykey, дело в том, что передаваемый в пакетный файл параметр, содержащий символы-разделители (например, пробел — банальный случай для путей), должен быть заключён в кавычки. В противном случае заключать параметр в кавычки не обязательно (но можно).
Пример:
"Sample.cmd" C:\boot.ini "c:\CONFIG.SYS" "C:\Program Files\Common Files\Microsoft Shared"
Параметры «C:\boot.ini» и «c:\CONFIG.SYS» не содержат символов-разделителей, потому их можно заключать в кавычки, а можно и не заключать (в примере «C:\boot.ini» не заключён в кавычки, а «c:\CONFIG.SYS» — заключён). Параметр же «C:\Program Files\Common Files\Microsoft Shared» содержит символы-разделители (в данном случае — пробел) и, чтобы он был воспринят как один параметр, а не несколько — требуется заключить его в кавычки.
Идём дальше. В отличие от ряда языков, в пакетный файл параметры передаются «как есть» — вместе с кавычками (если они были). И это надо учитывать при работе пакетного файла. И вот как раз для того, чтобы иметь возможность унифицировать обработку параметров, как заключённых в кавычки, так и без них — используется тильда:
"%~1"
То есть, сначала мы, при помощи тильды, убираем возможные кавычки у переданного параметра, а затем уже сами указываем кавычки. Таким образом, независимо от того, был ли передан параметр с кавычками или без — теперь мы гарантированно получим его унифицированное представление — с кавычками.
Я скрипты учусь писать по книжке Станека, там почему-то я не увидел, чтобы он у параметров тильду ставил. »
Мне сложно сказать, отчего Станек обошёл своим вниманием данный вопрос совершенно. Про «defined», во всяком случае, он не забыл.
P.S. Про параметры и тильду:
call /?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.