如何检查Windows CMD中的覆盖文件请求的结果?

我在网上search这个,但似乎无法find答案。 我有一个代码,在询问一个他想给文本文件的名字后创build一个文本文件。 该文件将在创build后打开。 但是,如果我selectN(否)覆盖请求,我不希望文件打开。 对于覆盖请求说N(否)后,我想再次要求指定另一个文件名。

然而,我不知道如何检查给出的覆盖请求的答案。

此外,我需要整个代码在一行。

这是我没有上面提到的额外的东西:

cmd /c @ECHO OFF & SET /P filename=What File name: & cmd /v /c copy /-y NUL !filename!.txt & cmd start /v /c start notepad !filename!.txt & Exit 

后来增加:

我正在处理以下内容,并在文件名被回显后不断收到错误消息“(这个时候是意外的”),如果我通过对部分文件进行注释来编辑文件,然后继续编辑它,但是,如果我退出cmd框,然后再次启动它,那么它不起作用,并且我得到一个错误信息,这是迄今为止的代码:

 @echo off SET /P filename=What File name? echo %filename% ::loop if exist !filename!.txt ( echo File Exists SET /P overwrite=Overwrite File? echo overwrite is %overwrite% If %overwrite%==Y ( echo "Yes, Y" ) ) echo finish 

如果我把%overwrite%单引号放在If '%overwrite%'==Y我不会再收到意外的错误信息。 我仍然面临的问题是当退出会话/ cmd框,我无法得到上面的行回显覆盖的价值。 它只是说“覆盖是”(没有引号,没有价值之后)。 如果我继续在同一个会话中运行batch file,我会得到一个覆盖值。

解决scheme无法从if语句回显%overwrite% (用户input)的值可以在这里find。

Solutions Collecting From Web of "如何检查Windows CMD中的覆盖文件请求的结果?"

编辑以适应评论

 cmd /v:on /q /c "for /l %a in (0 0 1) do (set /p "file=file? " & if exist "!file!" ( set "q=" & set /p "q=overwrite? " & if /i "!q!"=="y" ( type nul > "!file!" & start "" notepad "!file!" & exit ) ) else ( type nul > "!file!" & start "" notepad "!file!" & exit ))" 

根据要求,在一行。 要将其包含在批处理文件中,请将%a替换%a %%a

编辑一行,在文件操作上添加输入验证和错误检查,并缩短(变量长度减少,删除不需要的空格,文件创建代码重复数据删除…)以适应窗口“运行”对话框

编辑添加的初始cd /d "%userprofile%"以确保工作文件夹是可写的。 为什么? 因为从Windows 7中,包括/v:on (或关闭)从Windows运行对话框(单线程的OP原因) cmd的调用,该命令的活动目录是c:\windows\system32 (或无论系统在哪里)。 没有/v开关,活动目录是用户配置文件文件夹。

 cmd /v:on /q /c "cd/d "%userprofile%"&for /l %a in () do ((set/p"f=file? "||set "f=")&(if defined f if exist "!f!" ((set/p"q=overwrite? "||set "q=0")&if /i not "!q!"=="y" (set "f=")))&if defined f (type nul>"!f!" &&(start "" notepad "!f!" &exit)))" 

编辑经过大量的测试,我使它在XP中失败。 如果机器配置了禁用的命令扩展,以前的代码将会失败。 此外,与Ctrl-C的问题可以anoying。 这应该处理第一个问题,最小化第二个问题。

 cmd /v:on /e:on /q /c "cd/d "%userprofile%"&for /l %a in ()do ((set/p"f=file? "||(set f=&cd.))&(if defined f if exist "!f!" ((set/p"q=overwrite? "||(set q=&cd.))&if /i not "!q!"=="y" (set f=)))&if defined f (cd.>"!f!"&&(start "" notepad "!f!" &exit)))" 

在这种情况下最好避免通过copy来覆盖(因为ERRORLEVEL忽略覆盖状态)。 你可以做任何事情在你身边:

  • 你可以检查文件的存在( IF EXISTS !filename!.txt ),
  • 如果文件存在,你可以问用户该怎么做( SET /P userInput=Overwrite? (Yes/No/All) ),
  • 之后,你可以分析%userInput%来决定做什么(删除现有的文件,并创建一个相同的名称+打开编辑器或再次询问文件名)。

If %overwrite%==Y :如果%overwrite%为空,则执行为If ==Y – 显然是语法错误。

用你提到的singlequoutes: If '%overwrite%'==Y被执行为If ''==Y – 这是正确的语法,所以你的代码不会失败(但不是按预期运行)

%overwrite%为空的原因是:你在一个块内(在if (和对应的)之间)使用它,所以为了解析原因,它很容易(搜索delayed expansion ),你可以很容易地避免:

 @echo off SET /P filename=What File name? echo %filename% :loop if not exist %filename%.txt goto finish echo File Exists SET /P overwrite=Overwrite File? echo overwrite is %overwrite% If "%overwrite%"=="Y" ( echo "Yes, Y" ) else ( goto loop ) this line is never reached :finish echo finish 

当使用单行时,不能循环回到起始位置 – 但是,如果文件不存在,这只会创建文件并与文件一起启动记事本。

如果文件存在,它只会退出,而不是开始记事本,所以你知道你必须再试一次。

 cmd /c @ECHO OFF & SET /P filename=What File name: & cmd /v /c "if not exist !filename!.txt copy NUL !filename!.txt & start "" notepad !filename!.txt" & Exit