Вложенные операторы 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 в convert
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" 

Поместите космос между условием и открывающей скобкой: if exist "%somepath%" (

aschipfl 27.04.2018 18:04

Раз у вас даже есть два открывающихся ( ...

aschipfl 27.04.2018 18:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
91
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Это часть тяги. Просто изменили пути с цитированием и используйте стандартных переменных. При необходимости добавьте %LocalAppData% not defined check и используйте замену в ОС до 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» свое собственное утверждение вместо другого, и это позволило plum.sqlite перейти и изменить копию на «xcopy» и добавить «/ f» к Это. Работает как шарм! Огромное спасибо.

jsc 16.05.2018 21:06

Другие вопросы по теме