Windows 批处理的嵌套IF语句

Windows 批处理的嵌套IF语句,windows,batch-file,if-statement,stickynote,Windows,Batch File,If Statement,Stickynote,我目前正在尝试从旧机器上的配置文件中获取保存的项目列表,然后发送到新机器和配置文件,因为配置文件是相同的 在Windows 7上,位置%AppData%\Microsoft\Sticky Notes存储了便笺的.snt。该位置在本机上一直存在到Windows 10 1511 在Windows 10 1607上,它已移动到%LocalAppData%\Packages\Microsoft.microsofttickynotes\u 8wekyb3d8bbwe\LocalState”,并更改为plu

我目前正在尝试从旧机器上的配置文件中获取保存的项目列表,然后发送到新机器和配置文件,因为配置文件是相同的

在Windows 7上,位置
%AppData%\Microsoft\Sticky Notes
存储了便笺的
.snt
。该位置在本机上一直存在到Windows 10 1511

在Windows 10 1607上,它已移动到
%LocalAppData%\Packages\Microsoft.microsofttickynotes\u 8wekyb3d8bbwe\LocalState”,并更改为
plum.sqlite`

如果您从Windows 10 1607之前的版本升级,它将创建一个
Legacy
文件夹,其中包含
ThresholdNotes.snt
,并将转换为
plum.sqlite

我正在编写一个嵌套的
.bat
,它将:

如果新计算机上存在旧的便笺位置
检查拉取的
.snt
文件,然后复制到
上,否则
检查拉取的
.snt文件

如果新的旧位置不存在
创建然后复制并重命名
.snt
以转换
其他
复制、重命名

如果旧的便笺位置不存在
然后检查是否有新的
.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"
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" 
^^这部分似乎工作得很好,没有任何问题

这是推送部分,这是我似乎遇到问题的地方,但可能是它的格式?首先是变量,然后是实际操作部分

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"
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" 

除了语法问题(条件表达式和左括号之间缺少空格,
如果存在“%somepath%”(
),甚至一次两个左括号,
如果存在“%somepath%”(
),我相信你的问题在于逻辑以及你使用的缩进和括号的误导方式

让我们假设以下代码片段:

@echo关闭
设置“X=”&设置“Y=”
设置/P X=“X=”
设置/P Y=“Y=”
如果定义X如果定义Y(
回波X=%X%,Y=%Y%
)否则,回声X和/或Y为空
如果变量
X
为空,您希望返回什么

让我们看一下函数中相同但编写方式不同的代码(这次跳过变量定义/提示):

如果定义为X(
如果定义为Y(
回波X=%X%,Y=%Y%
)否则(
回波X和/或Y为空
)
)
您现在可能会注意到,如果是空变量
X
,则不会返回任何内容

固定代码可能如下所示:

如果定义为X(
如果定义为Y(
回波X=%X%,Y=%Y%
)否则(
回音Y是空的
)
)否则(
回波X为空,Y未选中
)
这就是拉动部分。只是通过引用和使用改变了路径 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

引用稍后完成的路径可以根据需要扩展路径

如果
回显“未检测到便笺”
,则不确定是否退出脚本。 如果确实要退出,则可以使用:

>&2 Echo "No Sticky Notes Detected"
exit /b 1
因此,回音进入stderr并以errorlevel1退出


代码未经测试,因此请检查我的更改。

在条件和左括号之间留出一个空格:如果存在“%somepath%”(一旦您有两个开头)。我能够使用您发布的内容,并给出了最后一个“如果”“它自己的声明,而不是另一个声明,让plum.sqlite过来,并将副本更改为“xcopy”,并在其上添加了“/f”。效果很好!非常感谢。