Batch file 为什么此脚本在不同的帐户上运行不同?

Batch file 为什么此脚本在不同的帐户上运行不同?,batch-file,cmd,Batch File,Cmd,好的,我写了一个复制/粘贴本地文件的脚本。 该文件工作正常,但并不总是给出第一个“CHOICE”命令 这似乎是在C:\temp\logs文件夹不存在时发生的。如果该文件夹不存在,它将跳转到:COPYFILES。如果它在那里,它工作得很好。有人能修改我的密码吗?也许最初的“如果不存在”陈述有什么问题,我看不出来。。。 想法 @echo关闭 对于('qwinsta/服务器:%COMPUTERNAME%^ | findstr“console”')中的/F“tokens=1,2”%%i do(设置log

好的,我写了一个复制/粘贴本地文件的脚本。 该文件工作正常,但并不总是给出第一个“CHOICE”命令

这似乎是在C:\temp\logs文件夹不存在时发生的。如果该文件夹不存在,它将跳转到:COPYFILES。如果它在那里,它工作得很好。有人能修改我的密码吗?也许最初的“如果不存在”陈述有什么问题,我看不出来。。。 想法

@echo关闭
对于('qwinsta/服务器:%COMPUTERNAME%^ | findstr“console”')中的/F“tokens=1,2”%%i do(设置loggedInUser=%%j)
setlocal
回显登录用户:%loggedInUser%
REM作为不相关[非最小]代码删除
:简介
REM作为不相关[非最小]代码删除
回显登录用户:%loggedInUser%
REM作为不相关[非最小]代码删除
:检查日志
如果不存在“C:\temp\logs\”(
mkdir“C:\temp\logs\”
echo.>“C:\temp\logs\appsense\u BACKUP\u robo.txt”
)否则(
echo.>“C:\temp\logs\appsense\u BACKUP\u robo.txt”
:STARTPROMPT
选项/C 12/N/M“您想:复制文件[1]还是粘贴文件[2]?”
如果错误级别2转到粘贴文件
如果错误级别1转到检查存在
)
:CHECKEXIST
如果存在“C:\temp\appsensebackup\%loggedInUser%”(
%loggedInUser%的echo APPSENSE备份文件夹已存在。
选项/C 12/N/M“您想删除以前的备份[1]还是取消[2]?”
如果错误级别2转到用户取消
如果错误级别1转到REMDIR
)否则(
转到:复制文件
)
:REMDIR
REM作为不相关[非最小]代码删除
转到:复制文件
:复制文件
REM作为不相关[非最小]代码删除
出口
:粘贴文件
REM作为不相关[非最小]代码删除
出口
:USERCANCEL
REM作为不相关[非最小]代码删除
端部

您的第一个提示在IF语句的ELSE子句中。
我个人只是尝试创建目录并让它失败,而不是费心检查它是否存在。
像这样:

。。。
:检查日志
md“C:\temp\logs\”>nul 2>nul
echo.>“C:\temp\logs\appsense\u BACKUP\u robo.txt”
:STARTPROMPT
选项/C 12/N/M“您想:复制文件[1]还是粘贴文件[2]?”
如果错误级别2转到粘贴文件
如果错误级别1转到检查存在
:CHECKEXIST
颜色0C
...
如果您想保持现有状态:

。。。
:检查日志
如果不存在“C:\temp\logs\”md“C:\temp\logs\”
echo.>“C:\temp\logs\appsense\u BACKUP\u robo.txt”
:STARTPROMPT
选项/C 12/N/M“您想:复制文件[1]还是粘贴文件[2]?”
如果错误级别2转到粘贴文件
如果错误级别1转到检查存在
:CHECKEXIST
颜色0C
...

我看不出第一个IF语句中有ELSE子句的理由。

我相当肯定,您认为发布的代码“不起作用”的原因是,您可能不打算像以前那样在该选项下阻塞Start提示符

注意:一般情况下,您应该避免使用GOTO,而是使用CALL

这张图片代表了代码的逻辑流程,我用橙色突出显示了我认为您的代码所采用的路径,并用红色突出显示了问题

如红色突出显示的,仅在目录已存在的情况下包含所选零件

以下是有争议的特定代码块:

:CHECKLOGS
IF NOT EXIST "C:\temp\logs\" (
mkdir "C:\temp\logs\"
echo.>"C:\temp\logs\appsense_BACKUP_robo.txt" 
) ELSE (
echo.>"C:\temp\logs\appsense_BACKUP_robo.txt" 


:STARTPROMPT
CHOICE /C 12 /N /M "Are you wanting to: Copy Files [1] OR Paste Files [2]?"
IF ERRORLEVEL 2 goto PASTEFILES
IF ERRORLEVEL 1 goto CHECKEXIST
)
您可能打算这样写:

:CHECKLOGS
IF NOT EXIST "C:\temp\logs\" (
mkdir "C:\temp\logs\"
echo.>"C:\temp\logs\appsense_BACKUP_robo.txt" 
) ELSE (
echo.>"C:\temp\logs\appsense_BACKUP_robo.txt" 
)

:STARTPROMPT
CHOICE /C 12 /N /M "Are you wanting to: Copy Files [1] OR Paste Files [2]?"
IF ERRORLEVEL 2 goto PASTEFILES
IF ERRORLEVEL 1 goto CHECKEXIST
我相信简单地使用上面的代码将按照您期望的方式修复您的代码


也就是说,如果您想遵循一些好的实践(事实上还有相当多的实践),整个脚本可以大大收紧。

我首先要问,这个脚本是如何运行的?(在
%ComputerName%
上返回单个“登录”用户帐户名似乎是一种相当复杂的方法)。我正在查看脚本,但没有清理它,您正在尝试在控制台上备份该用户,但是,这是由另一个用户执行的吗?如果没有,则不需要QWinsta部分,您可以使用用户%USERPROFILE%和%USERNAME%来获取配置文件目录etcGlenrichie,我已从您的问题中删除了不相关的非最小代码(请参阅)。这个论坛不是你发布代码希望他人为你改进代码的地方,它只是为了在特定的可复制问题上寻求帮助。谢谢Compo和Ben。所以之前这是以管理员身份运行的,所以需要提取登录的用户名。情况不再是这样了,所以你是对的。我现在已更新为使用%username%和%userprofile%来清理一些代码。@GlenRitchie,如果您创建一个仅包含以下内容的帐户,
@Echo%username%&Pause
并以“管理员”身份运行,它仍应输出您的帐户名,而不是管理员。