Вложенные IF-отчеты для партии
В настоящее время я пытаюсь получить список элементов, сохраненных из профиля на старой машине, а затем отправленных на новую машину и в профиль, поскольку этот профиль совпадает.
На 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 ответа
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
)