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

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

epoddubniy 09-09-2021 11:02 2966192

Сравнение переменной с пустым значением.
 
Здравствуйте. Помогите пожалуйста.

Сам скрипт
Код:

set "SHARA=\\srv-public\public"
for /F "tokens=1,2,3,4,5,6" %%e in ('net use ^| findstr.exe /r ".*%SHARA%.*"') do set "SHARA4F=%%e %%f %%g %%h %%i %%j" set "SOSTOYANIE=%%e" set "BUKVA=%%f" set "SHARA-NAME=%%g"

IF "%SHARA4F%"=="Ok" call :vykhod
IF "%SHARA4F%"=="Отсоединен" call :procedura
IF "%SHARA4F%"=="" call :procedura

:vykhod
exit /b

:procedura
net use %bukva% /delete /yes
net use Z: %SHARA% /Persistent:Yes

Вопрос № 1: если диск подсоединен, и в коде
Код:

for /F "tokens=1,2,3,4,5,6" %%e in ('net use ^| findstr.exe /r ".*%SHARA%.*"') do set "SHARA4F=%%e %%f %%g %%h %%i %%j" set "SOSTOYANIE=%%e" set "BUKVA=%%f" set "SHARA-NAME=%%g"
вместо
Код:

%SHARA% подставить значение \\srv-public\public
то в выводе команды будет то, что нужно
Код:

set "SHARA4F=Отсоединен Z: \\srv-public\public Microsoft Windows Network" set "SOSTOYANIE=Отсоединен" set "BUKVA=Z:" set "SHARA-NAME=\\srv-public\public"
. А если будет вот это
Код:

%SHARA%
, то вообще никакого вывода не будет. Скажите пожалуйста, как должно быть оформлено правильно вот это выражение, похоже в нем у меня первая ошибка?
Код:

('net use ^| findstr.exe /r ".*%SHARA%.*"')
Вопрос №2: когда сетевых подключений нет, у переменной SHARA4F - пустое значение, но вот это условие
Код:

IF "%SHARA4F%"=="" call :procedura
не срабатывает,
Код:

:procedure
не выполняется. Скажите пожалуйста, как правильно описать это условие и поведение при срабатывании этого условия, т.к. если пошагово осуществлять отладку скрипта в cmd при последовательном вводе команд
Код:

set "SHARA=\\srv-public\public"
for /F "tokens=1,2,3,4,5,6" %e in ('net use ^| findstr.exe /r ".*\\srv-public\public.*"') do set "SHARA4F=%e %f %g %h %i %j" set "SOSTOYANIE=%e" set "BUKVA=%f" set "SHARA-NAME=%g"

в выводе команды
Код:

echo %SOSTOYANIE%
получаю
Код:

%SOSTOYANIE%
а при выполнении
Код:

IF "%SHARA4F%"=="" echo ok
ничего не получаю (следовательно и переход на процедуру не сработает)

DJ Mogarych 09-09-2021 13:20 2966213

Домена нет? Если есть, то не лучше ли групповыми политиками реализовать?

epoddubniy 09-09-2021 14:00 2966218

Цитата:

Цитата DJ Mogarych
Домена нет? Если есть, то не лучше ли групповыми политиками реализовать? »

Домен есть. Реализовано, но не всегда и не у всех цепляется. Причем доменов несколько, шар - тоже несколько...Компов много, если уже существующую политику править, то нет гарантий, что что-то не крашнется, также как и, если новую создавать (к сожалению, реализация была на DefaultDomainPolicy).

Буду признателен если со скриптом поможете, DJ Mogarych

megaloman 09-09-2021 14:38 2966221

epoddubniy, Лучше бы Вы описали задачу, а не приводили своё решение. То, что Вы изобразили - извините, это одна большая ошибка. For у Вас не работает. Убедитесь:
Код:

For /F "tokens=1,2,3,4,5,6 delims=" %%e in ('net use ^| findstr.exe /r ".*%SHARA%.*"') do Echo "kuku" & set "SHARA4F=%%e %%f %%g %%h %%i %%j" set "SOSTOYANIE=%%e" set "BUKVA=%%f" set "SHARA-NAME=%%g"
Если для отладки вставить Echo "kuku" оно не появляется, то есть то, что Вы далее написали никогда не делается.
Строка присваиваний неверна изначально.
Код:

set "SHARA4F=%%e %%f %%g %%h %%i %%j" set "SOSTOYANIE=%%e" set "BUKVA=%%f" set "SHARA-NAME=%%g"
Надо Set что1=чему1 &Set что2=чему2 &Set что3=чему3

megaloman 09-09-2021 16:43 2966246

epoddubniy, Как я понял задачу:
Если Z: подключен к %SHARA%, то ничего не делаем
В противном случае: если Z: нет или он подключен к другому ресурсу, то отсоединяем его и net use Z: %SHARA% /Persistent:Yes
Вот вариант:
Код:

@Echo Off
        Set "SHARA=\\srv-public\public"
        Set "Letter=Z:"

        >nul 2>&1 (Net Use %Letter% |Findstr /I %SHARA% &&Exit /B)

        >nul 2>&1 Net Use %Letter% /Delete /Y
        Net Use %Letter% %SHARA% /Persistent:Yes
Exit /B


epoddubniy 09-09-2021 16:46 2966247

Цитата:

Цитата megaloman
Если для отладки вставить Echo "kuku" оно не появляется, то есть то, что Вы далее написали никогда не делается. »

megaloman, да, в этом и загвоздка, если вместо
Код:

%SHARA%
будет подставлено значение этой переменной
Код:

\\srv-public\public
то строка разложится на переменные (при условии что сетевое подключение существует) и при выполнении echo %SOSTOYANIE% или echo %BUKVA% у меня в консоль выведутся соответствующие значения.
Не понимаю, почему интерпретатор не "хавает" %SHARE%

megaloman 09-09-2021 16:58 2966250

Цитата:

Цитата epoddubniy
Не понимаю, почему интерпретатор не "хавает" %SHARE% »

Не понял, что Вы имеете ввиду, ИМХО, FindStr написан некорректно. Попробуйте так:
Код:

@Echo Off
cls
set "SHARA=\\srv-public\public"
for /F "tokens=1,2,3,4,5,6" %%e in ('net use ^| findstr.exe /I "%SHARA%"') do Set "SHARA4F=%%e %%f %%g %%h %%i %%j" set "SOSTOYANIE=%%e" set "BUKVA=%%f" set "SHARA-NAME=%%g"
Echo SHARA4F=%SHARA4F%

pause
Exit /B

Увидите, что For отработает, но Ваши Set написаны криво, опять же, For отработает, если есть подключение к шаре, иначе Nrt Use его не выдаст и FindStr не обнаружит

alpap 09-09-2021 17:03 2966252

epoddubniy,
а покажите конкретно вывод:
Код:

net use|findstr /irc:"%SHARA%"

epoddubniy 09-09-2021 17:31 2966266

Цитата:

Цитата megaloman
Не понял, что Вы имеете ввиду, ИМХО, FindStr написан некорректно. Попробуйте так: »

Cпасибо!!!!! megaloman
Цитата:

Цитата megaloman
Увидите, что For отработает, но Ваши Set написаны криво »

Действительно set оказались кривые... Поправил по Вашей рекомендации все - заработало.

megaloman, скажите пожалуйста, правильно ли я мыслю: если findstr.exe мне возвращает пустую строку, то переменным
SOSTOYANIE, BUKVA, SHARA-NAME при выполнении кода:
Код:

set "SOSTOYANIE=%%e" set "BUKVA=%%f" set "SHARA-NAME=%%g"
присвоится пустое значение?

А если им присвоилось пустое значение, почему при выполнении команды, например
Код:

IF "%BUKVA%"=="" (ECHO %date%)
в консоль не выводится текущая дата, то есть "проверка" условия IF оканчивается неудачей

megaloman 09-09-2021 17:58 2966278

Цитата:

Цитата epoddubniy
правильно ли я мыслю: »

Пустые строки For не обрабатывает. Убедитесь, нарисуйте For в таком виде:
Код:

for /F "tokens=1,2,3,4,5,6" %%e in ('net use ^| findstr.exe /I "%SHARA%"') Do Echo "Kuku"
То есть и код:
Код:

set "SOSTOYANIE=%%e" &set "BUKVA=%%f" &set "SHARA-NAME=%%g"
выполнен не будет. Все эти переменные: SOSTOYANIE, BUKVA, SHARA-NAME -не определены (можно сказать, пустые), если Вы не определяли их выше.
Цитата:

Цитата epoddubniy
в консоль не выводится текущая дата »

Что-то не так понимаете, у меня выводит. Разберитесь, проанализируйте тестовый вывод:
Код:

Echo "%BUKVA%"
Echo IF "%BUKVA%"=="" (ECHO %date%)

IF "%BUKVA%"=="" (ECHO %date%)


alpap 09-09-2021 19:24 2966283

Цитата:

Цитата epoddubniy
присвоится пустое значение? »

вам megaloman, который раз уже говорил, при таком (неправильном) написании переменных там никогда не будет пусто, вот пример, тут еще ничего нигде не присваивалось
Код:

@echo off
set "SOSTOYANIE=%%e" set "BUKVA=%%f" set "SHARA-NAME=%%g"
echo %SOSTOYANIE%
echo %BUKVA%
echo %SHARA-NAME%
pause

видно и так из кода что работает только первая переменная, вернее тут есть только единственная, если разберетесь - поймете
---
и вывод при правильном написании
Код:

@echo off
set "SOSTOYANIE=%%e"& set "BUKVA=%%f"& set "SHARA-NAME=%%g"
echo %SOSTOYANIE%
echo %BUKVA%
echo %SHARA-NAME%
pause


epoddubniy 10-09-2021 10:53 2966317

alpap, megaloman, возможно я не совсем правильно изложил, о чем хотел поинтересоваться в предыдущем посте.
Код я отредактировал с учетом поправок. Если \\srv-public\public подключена, то все - отрабатывает отлично, вопросов - нет. Если \\srv-public\public не подключена то не отрабатывает. получилось следующее (\\srv-public\public не подключена):

Код:

set "SHARA=\\srv-public\public"

for /F "tokens=1,2,3,4,5,6" %%e in ('net use ^| findstr.exe /i "%SHARA%"') do set "SHARA4F=%%e %%f %%g %%h %%i %%j"  & set "SOSTOYANIE=%%e" & set "BUKVA=%%f" & set "SHARA-NAME=%%g"

rem сетевая шара заведомо отключена, findstr.exe в выводе команды net use не найдет строку с \\srv-public\public и вернет пустое
rem значение (?), следовательно токены %%e %%f %%g %%h %%i %%j будут содержать пустую строку (?), следовательно
rem переменные SHARA4F, SOSTOYANIE, BUKVA, SHARA-NAME будут "пустые" (?) следовательно это условие IF "%SHARA4F%"=="" call :procedura должно отработать и
rem должна выполнится процедура
rem net use %bukva% /delete /yes
rem net use Z: %SHARA% /Persistent:Yes

IF "%SHARA4F%"=="" call :procedura
IF "%SHARA4F%"=="" echo "kyky"

:procedura
net use %bukva% /delete /yes
net use Z: %SHARA% /Persistent:Yes

В результате ни
IF "%SHARA4F%"=="" call :procedura
IF "%SHARA4F%"=="" echo "kyky"
не отработали

Также попробовал выполнить пошаговую отладку, результат излагаю ниже:
Код:

C:\Users\adm>net use * /delete
В списке нет элементов.


C:\Users\adm>net use
Новые подключения будут запомнены.

В списке нет элементов.


C:\Users\adm>set "SHARA=\\srv-public\public"

C:\Users\adm>for /F "tokens=1,2,3,4,5,6" %e in ('net use ^| findstr.exe /i "%SHARA%"') do set "SHARA4F=%e %f %g %h %i %j"  & set "SOSTOYANIE=%e" & set "BUKVA=%f" & set "SHARA-NAME=%g"

C:\Users\adm>IF "%SHARA4F%"=="" echo "kyky"

C:\Users\adm>


alpap 10-09-2021 12:10 2966332

вот так должно работать
Код:

@echo off
set "SHARA=\\srv-public\public"

for /F "tokens=1-6" %%e in ('net use ^| findstr.exe /i "%SHARA%"') do (
  set "SHARA4F=%%e %%f %%g %%h %%i %%j"
  set "SOSTOYANIE=%%e"
  set "BUKVA=%%f"
  set "SHARA-NAME=%%g"
)

IF "%SHARA4F%"=="" (
  echo "%SHARA4F%" - NULL
) else (
  call :procedura "%SHARA%" "%BUKVA%"
)
pause
exit

:procedura
  net use "%~2" /delete /yes
  net use Z: "%~1" /Persistent:Yes
exit /b


epoddubniy 10-09-2021 15:22 2966343


alpap, не получилось :(

megaloman 10-09-2021 16:12 2966347

Цитата:

Цитата megaloman
Лучше бы Вы описали задачу, а не приводили своё решение. »

Да откажитесь Вы наконец от For, разбор токенов для Net Use неоднозначен в разных ситуациях.
Вот вывод Net Use
Код:

Новые подключения будут запомнены.


Состояние  Локальный  Удаленный                Сеть

-------------------------------------------------------------------------------
OK          K:        \\Сервер\Test1      Microsoft Windows Network
OK                    \\Сервер\Test1      Microsoft Windows Network
Команда выполнена успешно.

Вот тестовый код:
Код:

@Echo Off
        Set "SHARA=\\Сервер\Test1"

        for /F "tokens=1-6" %%e in ('net use ^| findstr.exe /i "%SHARA%"') do (
                  Echo set "SHARA4F=%%e %%f %%g %%h %%i %%j"
                  Echo set "SOSTOYANIE=%%e"
                  Echo set "BUKVA=%%f"
                  Echo set "SHARA-NAME=%%g"
)
Exit /B

Вот его вывод:
Код:

set "SHARA4F=OK K: \\Сервер\Test1 Microsoft Windows Network"
set "SOSTOYANIE=OK"
set "BUKVA=K:"
set "SHARA-NAME=\\Сервер\Test1"
set "SHARA4F=OK \\Сервер\Test1 Microsoft Windows Network "
set "SOSTOYANIE=OK"
set "BUKVA=\\Сервер\Test1"
set "SHARA-NAME=Microsoft"

Никак не пойму, что не устроило в моём решении? Разве что желание доделать своё ...

alpap 10-09-2021 17:17 2966349

Цитата:

Цитата epoddubniy
alpap, не получилось »

я не могу гадать на кофейной гуще
я просил в п8 показать вывод, можете аккуратно замазать конфиденциальные данные. но так чтобы видно было пробелы.
и просто вывод: net use

megaloman 11-09-2021 09:49 2966375

epoddubniy, Если хочется For c токенами
Код:

@Echo Off
        Set "MyRemote=\\Сервер\Test2"
        Set "MyLocal=K:"

        Set "Status=" &Set "Local=" &Set "Remote=" &Set "Network="

        For /F "tokens=1-6 delims= " %%i in ('net use ^| findstr.exe /i "%MyRemote%"') Do If Not "%%n"=="" (
                Set "Status=%%i" &Set "Local=%%j" &Set "Remote=%%k" &Set "Network=%%l %%m %%n"
                GoTo :Continue
                ) Else (
                Set "Status=%%i" &Set "Remote=%%j" &Set "Network=%%k %%l %%m"
        )
        :Continue

        If "%Remote%"=="" (Echo "%MyRemote%" не подключен) Else (Echo Status="%Status%"  Local="%Local%" Remote="%Remote%" Network="%Network%")

        If /I "%MyLocal%"=="%Local%" If /I "%MyRemote%"=="%Remote%" Exit /B 0

        >nul 2>&1 Net Use %MyLocal% /Delete /Y
        >nul 2>&1 Net Use %MyRemote% /Delete /Y
        Net Use %MyLocal% %MyRemote%
Exit /B

Но, чтобы не городить огород, примитивное, но, ИМХО, надёжное решение:
Код:

@Echo Off
        Set "MyRemote=\\Сервер\Test1"
        Set "MyLocal=K:"
       
        Set "Mask=Моя папка или файл на сетевом диске которая там обязательно присутствует"

        >nul 2>&1 Dir "%MyLocal%\%Mask%" ||(
                >nul 2>&1 Net Use %MyLocal% /Delete /Y
                >nul 2>&1 Net Use %MyRemote% /Delete /Y
                Net Use %MyLocal% %MyRemote%
        )
Exit /B



Время: 10:13.

Время: 10:13.
© OSzone.net 2001-