Вложенные IF-отчеты для партии

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

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

На Windows 10 1607 он был перемещен в %LocalAppData%\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState" and changed toplum.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 ответа

Решение
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. Просто изменил пути с цитированием и использованием переменных std. добавлять %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.

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

Помимо проблем с синтаксисом (пропуски между условным выражением и открывающей скобкой, 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
)
Другие вопросы по тегам