Показать полную графическую версию : [решено] Сравнение переменной с пустым значением.
epoddubniy
09-09-2021, 11:02
Здравствуйте. Помогите пожалуйста.
Сам скрипт
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
Домена нет? Если есть, то не лучше ли групповыми политиками реализовать?
epoddubniy
09-09-2021, 14:00
Домена нет? Если есть, то не лучше ли групповыми политиками реализовать? »
Домен есть. Реализовано, но не всегда и не у всех цепляется. Причем доменов несколько, шар - тоже несколько...Компов много, если уже существующую политику править, то нет гарантий, что что-то не крашнется, также как и, если новую создавать (к сожалению, реализация была на DefaultDomainPolicy).
Буду признателен если со скриптом поможете, DJ Mogarych
megaloman
09-09-2021, 14:38
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
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
Если для отладки вставить Echo "kuku" оно не появляется, то есть то, что Вы далее написали никогда не делается. »
megaloman, да, в этом и загвоздка, если вместо %SHARA% будет подставлено значение этой переменной \\srv-public\public то строка разложится на переменные (при условии что сетевое подключение существует) и при выполнении echo %SOSTOYANIE% или echo %BUKVA% у меня в консоль выведутся соответствующие значения.
Не понимаю, почему интерпретатор не "хавает" %SHARE%
megaloman
09-09-2021, 16:58
Не понимаю, почему интерпретатор не "хавает" %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 не обнаружит
epoddubniy,
а покажите конкретно вывод:
net use|findstr /irc:"%SHARA%"
epoddubniy
09-09-2021, 17:31
Не понял, что Вы имеете ввиду, ИМХО, FindStr написан некорректно. Попробуйте так: »
Cпасибо!!!!! 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
правильно ли я мыслю: »Пустые строки 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 -не определены (можно сказать, пустые), если Вы не определяли их выше.в консоль не выводится текущая дата »Что-то не так понимаете, у меня выводит. Разберитесь, проанализируйте тестовый вывод:Echo "%BUKVA%"
Echo IF "%BUKVA%"=="" (ECHO %date%)
IF "%BUKVA%"=="" (ECHO %date%)
присвоится пустое значение? »
вам 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
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>
вот так должно работать
@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
https://i.ibb.co/DgLsL6M/NetUse.png (https://ibb.co/YTbYbKd)
alpap, не получилось :(
megaloman
10-09-2021, 16:12
Лучше бы Вы описали задачу, а не приводили своё решение. »Да откажитесь Вы наконец от For, разбор токенов для 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"
Никак не пойму, что не устроило в моём решении? (http://forum.oszone.net/post-2966246-5.html) Разве что желание доделать своё ...
alpap, не получилось »
я не могу гадать на кофейной гуще
я просил в п8 показать вывод, можете аккуратно замазать конфиденциальные данные. но так чтобы видно было пробелы.
и просто вывод: net use
megaloman
11-09-2021, 09:49
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
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.