Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Ошибка работы скрипта (Непредвиденное появление: and) (http://forum.oszone.net/showthread.php?t=228281)

sunnykey 20-02-2012 07:13 1862511

Ошибка работы скрипта (Непредвиденное появление: and)
 
Здравствуйте, написал батник такого содержания:
Код:

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 1862665

Цитата:

Непредвиденное появление: and
if "%1"=="" (goto :error) тут уберите кавычки с %1. А когда будете ему передовать путь\файл реестра, передовайте в кавычках.
К примеру:
Код:

C:\Documents and Settings\admin>TimeSync.bat "C:\Documents and Settings\admin\Рабочий стол\import.reg"

Iska 20-02-2012 17:40 1862882

Цитата:

Цитата DesmondTruman
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 1863240

Цитата:

Цитата Iska
Неправильный подход. Кавычки тут нужны и обязательны. Просто нужно приучиться использовать не просто кавычки «"%1"», а «"%~1"». »

Без кавычек программа отработала правильно. Возникает сразу вопрос: зачем нужна тильда? Я скрипты учусь писать по книжке Станека, там почему-то я не увидел, чтобы он у параметров тильду ставил. Прошу объяснить, либо ссылку дать где это прописано.

Iska 21-02-2012 05:54 1863256

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"
То есть, сначала мы, при помощи тильды, убираем возможные кавычки у переданного параметра, а затем уже сами указываем кавычки. Таким образом, независимо от того, был ли передан параметр с кавычками или без — теперь мы гарантированно получим его унифицированное представление — с кавычками.

Цитата:

Цитата sunnykey
Я скрипты учусь писать по книжке Станека, там почему-то я не увидел, чтобы он у параметров тильду ставил. »

Мне сложно сказать, отчего Станек обошёл своим вниманием данный вопрос совершенно. Про «defined», во всяком случае, он не забыл.

P.S. Про параметры и тильду:
Код:

call /?


Время: 06:34.

Время: 06:34.
© OSzone.net 2001-