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

时间:2014-06-04 10:08:14

标签: windows batch-file cmd

我在网上搜索过这个,但似乎无法找到答案。我有一个代码,在询问一个他/她想要给文本文件的名称后创建一个文本文件。然后在创建后打开该文件。但是,如果我选择N(否)来覆盖请求,我不希望该文件打开。我想要在对覆盖请求说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框时,我无法获得上面的行来回显覆盖的值。它只是说“覆盖是”(没有引号,后面没有任何值)。如果我继续在同一个会话中再次运行批处理文件,我会得到一个覆盖值。

可以找到无法从if语句回显%overwrite%(用户输入)值的解决方案here

4 个答案:

答案 0 :(得分:2)

已修改以适应评论

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

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

已修改添加了初始cd /d "%userprofile%"以确保工作文件夹可写。为什么?因为来自Windows 7,包括来自Windows运行对话框的/v:on调用中的cmd(或关闭)(一个内联的OP原因),该命令的活动目录为{{1 (或系统的任何地方)。如果没有c:\windows\system32开关,则活动目录是用户配置文件文件夹。

/v

已编辑经过大量测试后,我在XP中失败了。如果计算机配置了禁用的命令扩展,则前面的代码将失败。此外,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)))" 的问题可能很烦人。这应该处理第一个问题并最小化第二个问题。

Ctrl-C

答案 1 :(得分:0)

在这种情况下,最好避免copy覆盖(因为它ERRORLEVEL会忽略覆盖状态)。你可以随心所欲:

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

答案 2 :(得分:0)

使用单行时,您无法循环回到开头 - 但如果文件不存在,这只会创建文件并使用该文件启动记事本。

如果文件存在,它将退出并且不启动记事本,因此您知道必须再次尝试。

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

答案 3 :(得分:0)

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

使用您提到的单键:If '%overwrite%'==Y执行为If ''==Y - 这是正确的语法,因此您的代码没有失败(但没有按预期运行)

%overwrite%为空的原因:你在一个块中使用它(在if (和相应的)之间,所以为了解析原因它很容易(搜索{{1} }})。 您可以轻松避免这种情况:

delayed expansion