PDA

Показать полную графическую версию : [решено] Сравнение переменной с пустым значением.


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 не обнаружит

alpap
09-09-2021, 17:03
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%)

alpap
09-09-2021, 19:24
присвоится пустое значение? »
вам 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>

alpap
10-09-2021, 12:10
вот так должно работать

@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
10-09-2021, 17:17
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