Почему этот скрипт работает по-разному на разных учетных записях? - PullRequest
0 голосов
/ 28 октября 2019

Хорошо, поэтому я написал сценарий перепрофилирования для копирования / вставки локальных файлов. Файл работает нормально, но он не всегда дает первую команду «ВЫБОР».

Кажется, что это происходит, когда папка C: \ temp \ logs не существует. Если эта папка не существует, она перейдет к: COPYFILES. Если это там, это работает отлично. Может ли кто-нибудь пересмотреть мой код? Может быть, что-то не так с этим первоначальным утверждением «ЕСЛИ НЕ СУЩЕСТВУЕТ», которого я не вижу ... Мысли?

@echo off
for /F "tokens=1,2" %%i in ('qwinsta /server:%COMPUTERNAME% ^| findstr "console"') do (set loggedInUser=%%j)

setlocal

echo Logged In User: %loggedInUser%
REM REMOVED AS UNRELATED [NOT MINIMAL] CODE

:INTRO
REM REMOVED AS UNRELATED [NOT MINIMAL] CODE
echo Logged In User: %loggedInUser%
REM REMOVED AS UNRELATED [NOT MINIMAL] CODE

:CHECKLOGS
IF NOT EXIST "C:\temp\logs\" (
    mkdir "C:\temp\logs\"
    echo.>"C:\temp\logs\appsense_BACKUP_robo.txt" 
) ELSE (
    echo.>"C:\temp\logs\appsense_BACKUP_robo.txt" 

    :STARTPROMPT
    CHOICE /C 12 /N /M "Are you wanting to: Copy Files [1] OR Paste Files [2]?"
    IF ERRORLEVEL 2 goto PASTEFILES
    IF ERRORLEVEL 1 goto CHECKEXIST
)

:CHECKEXIST
IF EXIST "C:\temp\appsensebackup\%loggedInUser%" (
    echo APPSENSE BACKUP FOLDER FOR %loggedInUser% ALREADY EXISTS.

    CHOICE /C 12 /N /M "Would you like to: Delete Previous Backup [1] OR Cancel [2]?"
    IF ERRORLEVEL 2 goto USERCANCEL
    IF ERRORLEVEL 1 goto REMDIR
) ELSE (
    GOTO :COPYFILES
)

:REMDIR
REM REMOVED AS UNRELATED [NOT MINIMAL] CODE
GOTO :COPYFILES 

:COPYFILES
REM REMOVED AS UNRELATED [NOT MINIMAL] CODE
EXIT

:PASTEFILES
REM REMOVED AS UNRELATED [NOT MINIMAL] CODE
EXIT

:USERCANCEL
REM REMOVED AS UNRELATED [NOT MINIMAL] CODE

endlocal

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Я вполне уверен, что причина, по которой вы полагаете, что отправленный вами код "не работает", заключается в том, что вы, вероятно, не намеревались вводить Стартовую подсказку при таком выборе, как вы.

Примечание: в общем, вам следует избегать использования GOTO и вместо этого использовать CALL.

Эта картинка представляет логический поток вашего кода, я выделил путь, который, как я полагаю, принимает ваш код в Orange, и я выделилпроблема в красном.

enter image description here

Как выделено красным, вы включаете выбранную часть только в том случае, если Каталог уже существует.

Вот конкретный рассматриваемый блок кода:

:CHECKLOGS
IF NOT EXIST "C:\temp\logs\" (
mkdir "C:\temp\logs\"
echo.>"C:\temp\logs\appsense_BACKUP_robo.txt" 
) ELSE (
echo.>"C:\temp\logs\appsense_BACKUP_robo.txt" 


:STARTPROMPT
CHOICE /C 12 /N /M "Are you wanting to: Copy Files [1] OR Paste Files [2]?"
IF ERRORLEVEL 2 goto PASTEFILES
IF ERRORLEVEL 1 goto CHECKEXIST
)

Вы, вероятно, намеревались написать это как:

:CHECKLOGS
IF NOT EXIST "C:\temp\logs\" (
mkdir "C:\temp\logs\"
echo.>"C:\temp\logs\appsense_BACKUP_robo.txt" 
) ELSE (
echo.>"C:\temp\logs\appsense_BACKUP_robo.txt" 
)

:STARTPROMPT
CHOICE /C 12 /N /M "Are you wanting to: Copy Files [1] OR Paste Files [2]?"
IF ERRORLEVEL 2 goto PASTEFILES
IF ERRORLEVEL 1 goto CHECKEXIST

Я полагаю, что простое использование вышеприведенного кода исправит ваш код на путивы ожидаете этого.

Тем не менее, весь сценарий может быть значительно ужесточен, если вы захотите следовать некоторым хорошим практикам (и даже чуть дальше).

0 голосов
/ 28 октября 2019

Ваша первая подсказка находится в предложении ELSE вашего оператора IF.
Лично я просто пытаюсь создать каталог и позволить ему потерпеть неудачу, вместо того, чтобы проверять, существует ли он.
Вот так:

...
:CHECKLOGS
md "C:\temp\logs\" >nul 2>nul
echo.>"C:\temp\logs\appsense_BACKUP_robo.txt"
:STARTPROMPT
CHOICE /C 12 /N /M "Are you wanting to: Copy Files [1] OR Paste Files [2]?"
IF ERRORLEVEL 2 goto PASTEFILES
IF ERRORLEVEL 1 goto CHECKEXIST


:CHECKEXIST
color 0C
...

Если вы хотите оставить все как есть:

...
:CHECKLOGS
IF NOT EXIST "C:\temp\logs\" md "C:\temp\logs\"
echo.>"C:\temp\logs\appsense_BACKUP_robo.txt" 

:STARTPROMPT
CHOICE /C 12 /N /M "Are you wanting to: Copy Files [1] OR Paste Files [2]?"
IF ERRORLEVEL 2 goto PASTEFILES
IF ERRORLEVEL 1 goto CHECKEXIST


:CHECKEXIST
color 0C
...

Я не вижу причин для того, чтобы у первого оператора IF было предложение ELSE.

...