Вложенные IF-отчеты для партии - PullRequest
0 голосов
/ 27 апреля 2018

В настоящее время я пытаюсь получить список элементов, сохраненных из профиля на старой машине, а затем отправленных на новую машину и в профиль, поскольку этот профиль совпадает.

В Windows 7 в папке %AppData%\Microsoft\Sticky Notes хранится .snt для заметок. Это местоположение существует изначально вплоть до Windows 10 1511.

В Windows 10 1607 он был перемещен в %LocalAppData%\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState" and changed to plum.sqlite`.

Если вы обновились с более ранней версии, чем Windows 10 1607, она создаст папку Legacy с ThresholdNotes.snt в ней, которая преобразуется в plum.sqlite.

Я пишу вложенный .bat, который будет:

ЕСЛИ старое местоположение заметок на новом компьютере существует
проверьте наличие файла .snt, затем скопируйте
ELSE
проверить на вытащил .snt file

ЕСЛИ новое унаследованное местоположение не существует
создать, затем скопировать и переименовать .snt для преобразования
ELSE
копирование, переименование

ЕСЛИ старое место для заметок не существует
затем проверьте наличие нового .sqlite файла
ELSE
скопировать новый файл на новое место

В противном случае скажите, что они не обнаружены.

Но, похоже, я пишу неправильно или что-то в этом роде, потому что я поставил паузу в .bat, но он сразу закрывается при запуске.

Вот текущая часть Pull, где она получает .snt или .sqlite. Сначала переменные, а затем действительная часть действия.

REM Saves Users Sticky Notes
Set StickyNotes="%userprofile%\AppData\Roaming\Microsoft\Sticky Notes\StickyNotes.snt"
Set FlashStickyNotes="%~dp0%USERNAME%\StickyNotes"

REM Saves Users Sticky Notes From Win 10 1607+
Set StickyNotesWin10="%userprofile%\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite"
Set FlashStickyNotesWin10="%~dp0%USERNAME%\StickyNotesWin10"


Title Pulling StickyNotes
if exist %StickyNotes% ( xcopy %StickyNotes% %FlashStickyNotes% /f /y ) ELSE if exist %StickyNotesWin10% ( 
xcopy %StickyNotesWin10% %FlashStickyNotesWin10% /f /y ) else Echo "No Sticky Notes Detected"

^^ Эта часть работает нормально и не имеет проблем

Вот часть Push, и вот тут у меня, похоже, проблемы, но, возможно, ее форматирование? Сначала переменные, а затем действительная часть действия.

REM Saves Users Sticky Notes
Set StickyNotes="%userprofile%\AppData\Roaming\Microsoft\Sticky Notes\"
Set FlashStickyNotes="%~dp0%USERNAME%\StickyNotes\StickyNotes.snt"

REM Saves Users Sticky Notes From Win 10 1607+
Set StickyNotesWin10="%userprofile%\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\"
Set FlashStickyNotesWin10="%~dp0%USERNAME%\StickyNotesWin10\plum.sqlite"

Title Pushing StickyNotes
REM if old sticky notes location on the new computer exists, then check for pulled .snt file, then copy over ELSE
REM if new sticky notes location exists, check for pulled .snt file, if new legacy location not exist, then create and then copy and rename .snt to convert, else copy,rename
REM if old sticky notes location not exist, then check for new .sqlite file, if exist then copy new file to new location ELSE
REM otherwise say there are none detected
IF exist "%userprofile%\AppData\Roaming\Microsoft\Sticky Notes\"( IF exist "%FlashStickyNotes%"( xcopy %FlashStickyNotes% %StickyNotes% /F /Y ) 
IF exist "%userprofile%\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\"(
    IF exist "%FlashStickyNotes%"(
        IF not exist "%userprofile%\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\Legacy"(
            mkdir "%userprofile%\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\Legacy"
            xcopy %FlashStickyNotes% "%userprofile%\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\Legacy\ThresholdNotes.snt" /F /Y
        ) else IF exist "%userprofile%\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\Legacy"((
            xcopy %FlashStickyNotes% "%userprofile%\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\Legacy\ThresholdNotes.snt" /F /Y
        )
    )
) else IF not exist "%StickyNotes%" (
    IF exist %FlashStickyNotesWin10% (
    copy %FlashStickyNotesWin10% %StickyNotesWin10% /Y
    )
)
) ELSE Echo "No Sticky Notes Detected" 

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018
REM OS before Vista have no LocalAppData variable
if not defined LocalAppData set "LocalAppData=%AppData%\..\Local"

REM Saves Users Sticky Notes
Set StickyNotes=%AppData%\Microsoft\Sticky Notes\StickyNotes.snt
Set FlashStickyNotes=%~dp0%USERNAME%\StickyNotes

REM Saves Users Sticky Notes From Win 10 1607+
Set StickyNotesWin10=%LocalAppData%\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite
Set FlashStickyNotesWin10=%~dp0%USERNAME%\StickyNotesWin10


Title Pulling StickyNotes
if exist "%StickyNotes%" (
    xcopy "%StickyNotes%" "%FlashStickyNotes%" /f /y
) else if exist "%StickyNotesWin10%" (
    xcopy "%StickyNotesWin10%" "%FlashStickyNotesWin10%" /f /y
) else Echo "No Sticky Notes Detected"

Это часть Pull. Просто изменил пути с цитированием и использованием стандартных переменных. Добавить %LocalAppData% не определено проверить при необходимости и использовать замену на ОС до Vista.

REM OS before Vista have no LocalAppData variable
if not defined LocalAppData set "LocalAppData=%AppData%\..\Local"

REM Saves Users Sticky Notes
Set StickyNotes=%AppData%\Microsoft\Sticky Notes
Set FlashStickyNotes=%~dp0%USERNAME%\StickyNotes\StickyNotes.snt

REM Saves Users Sticky Notes From Win 10 1607+
Set StickyNotesWin10=%LocalAppData%\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState
Set FlashStickyNotesWin10=%~dp0%USERNAME%\StickyNotesWin10\plum.sqlite

Title Pushing StickyNotes
REM if old sticky notes location on the new computer exists, then check for pulled .snt file, then copy over ELSE
REM if new sticky notes location exists, check for pulled .snt file, if new legacy location not exist, then create and then copy and rename .snt to convert, else copy,rename
REM if old sticky notes location not exist, then check for new .sqlite file, if exist then copy new file to new location ELSE
REM otherwise say there are none detected
IF exist "%StickyNotes%" (
    IF exist "%FlashStickyNotes%" (
        xcopy "%FlashStickyNotes%" "%StickyNotes%" /F /Y
    )
) else IF exist "%StickyNotesWin10%\" (
    IF exist "%FlashStickyNotes%" (
        IF not exist "%StickyNotesWin10%\Legacy" (
            mkdir "%StickyNotesWin10%\Legacy"
            xcopy "%FlashStickyNotes%" "%StickyNotesWin10%\Legacy\ThresholdNotes.snt" /F /Y
        ) else (
            xcopy "%FlashStickyNotes%" "%StickyNotesWin10%\Legacy\ThresholdNotes.snt" /F /Y
        )
    )
) else (
    IF exist "%FlashStickyNotesWin10%" (
        copy "%FlashStickyNotesWin10%" "%StickyNotesWin10%" /Y
    ) else (
        Echo "No Sticky Notes Detected"
    )
)

Буквенные пути заменены переменными, где это необходимо. Отступы сделаны последовательными таким образом, открывающие и закрывающие скобки могут быть соединены проще Заменены устаревшие else if чеки только с else.

Цитирование путей сделано позже, так как позволяет расширять пути при необходимости.

Не уверен, выйдете ли вы из сценария, если Echo "No Sticky Notes Detected". Если вы хотите выйти, то можете использовать:

>&2 Echo "No Sticky Notes Detected"
exit /b 1

поэтому эхо отправляется в stderr и завершается с уровнем ошибки 1.

Код не проверен, поэтому, пожалуйста, проверьте мои изменения.

0 голосов
/ 27 апреля 2018

Помимо проблем с синтаксисом, которые у вас есть (отсутствует ПРОБЕЛ между условным выражением и открывающей скобкой, if exist "%somepath%" (; и даже двумя открывающими скобками один раз, if exist "%somepath%"((), я считаю, что ваша проблема заключается в логике и вводящий в заблуждение способ отступа и заключения в скобки, который вы используете.

Допустим, следующий фрагмент кода:

@echo off
set "X=" & set "Y="
set /P X="X="
set /P Y="Y="

if defined X if defined Y (
    echo X=%X%, Y=%Y%
) else echo X and/or Y is empty

Что вы ожидаете получить в случае, если переменная X пуста?

Давайте посмотрим на тот же код в функции, но написанный по-разному (на этот раз пропуская определения / подсказки переменных):

if defined X (
    if defined Y (
        echo X=%X%, Y=%Y%
    ) else (
        echo X and/or Y is empty
    )
)

Теперь вы можете заметить, что ничего не возвращается в случае пустой переменной X.

Фиксированный код может выглядеть следующим образом:

if defined X (
    if defined Y (
        echo X=%X%, Y=%Y%
    ) else (
        echo Y is empty
    )
) else (
    echo X is empty, Y not checked
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...