Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Сравнение переменной с пустым значением.

Ответить
Настройки темы
CMD/BAT - [решено] Сравнение переменной с пустым значением.

Пользователь


Сообщения: 105
Благодарности: 1

Профиль | Отправить PM | Цитировать


Здравствуйте. Помогите пожалуйста.

Сам скрипт
Код: Выделить весь код
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
ничего не получаю (следовательно и переход на процедуру не сработает)

Отправлено: 11:02, 09-09-2021

 

Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


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

Последний раз редактировалось alpap, 09-09-2021 в 19:30.

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:24, 09-09-2021 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 105
Благодарности: 1

Профиль | Отправить PM | Цитировать


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>

Отправлено: 10:53, 10-09-2021 | #12


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


вот так должно работать
Код: Выделить весь код
@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
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:10, 10-09-2021 | #13


Пользователь


Сообщения: 105
Благодарности: 1

Профиль | Отправить PM | Цитировать



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

Отправлено: 15:22, 10-09-2021 | #14


Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


Цитата 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"
Никак не пойму, что не устроило в моём решении? Разве что желание доделать своё ...

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 10-09-2021 в 16:39.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:12, 10-09-2021 | #15


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


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

Отправлено: 17:17, 10-09-2021 | #16


Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 11-09-2021 в 10:15.

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:49, 11-09-2021 | #17



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Сравнение переменной с пустым значением.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Реализация функций длины переменной, выделение подстроки с параметрами в переменной. NiOl Скриптовые языки администрирования Windows 7 31-01-2019 19:58
CMD/BAT - [решено] Сравнение переменной цикла со строковой переменной NickM Скриптовые языки администрирования Windows 2 17-01-2017 10:28
CMD/BAT - [решено] В переменной содержится имя переменной opravdin Скриптовые языки администрирования Windows 3 28-01-2013 11:11
CMD/BAT - [решено] Сравнение строк с переменной и добавление в случае отсутствия zion87 Скриптовые языки администрирования Windows 2 04-01-2013 15:08
Delphi - [решено] SQL Выбор записей с максимальным значением tarakan1983 Программирование и базы данных 29 14-06-2011 00:13




 
Переход