我有一个批处理文件,可以自动将一堆文件从一个地方复制到另一个地方,然后返回给我.唯一的事情就是它帮助我,我不小心选择了命令缓冲区中的命令,并大量覆盖未经修改的更改.
我的.bat文件需要什么代码才能让它说"你确定",并让我在运行文件的其余部分之前输入"y"吗?如果输入"y"之外的任何内容,它应该退出该行的执行.
编辑 11月27日好的我再次标记这个未答复,因为我仍然无法弄明白.当我打电话给"退出"时 它关闭cmd.exe这不是我想要的.这一切都是因为Windows实现了命令缓冲区错误[不同于我至少习惯的]
我知道,在比较批处理文件中的内容是否相等时,通常将两边括在引号中,例如
IF "%myvar% NEQ "0"
Run Code Online (Sandbox Code Playgroud)
但是,当使用“大于”或“小于”进行比较时,这不起作用,因为操作数将被视为带有引号的字符串。所以你可以这样做
IF %myvar% GTR 20000
Run Code Online (Sandbox Code Playgroud)
需要注意的是,如果变量 %myvar% 没有声明,那么就像这样做
IF GTR 20000
Run Code Online (Sandbox Code Playgroud)
这是一个语法错误。
我想出了以下解决方法:
IF 1%myvar% GTR 120000
Run Code Online (Sandbox Code Playgroud)
我希望这会导致IF 1 GTR 120000ifmyvar未定义,并且它似乎有效。
这是比较数字和计算未声明变量的安全方法,还是我只是提出了一个全新的警告?
所以 - 这是代码
@echo off
setlocal
for %%a in (a A j J z Z) do for %%c in (d D) do if "%%c" geq "%%a" (echo "%%c" geq "%%a") else (echo "%%c" lss "%%a")
for %%a in (Blue blue BLUE Red red RED) do for %%c in (Pink pink PINK) do if "%%c" geq "%%a" (echo "%%c" geq "%%a") else (echo "%%c" lss "%%a")
Run Code Online (Sandbox Code Playgroud)
结果如下:
Microsoft Windows [Version 10.0.19042.804]
(c) 2020 Microsoft Corporation. All rights reserved.
"d" geq "a" …Run Code Online (Sandbox Code Playgroud) 受到这个问题及其答案的启发,我做了一些测试。一个答案表明,数字太大(超过 32 位整数)并且它们被截断,但这并不能解释结果。同样显然它不会将双方作为字符串进行比较(正如我所期望的那样)。似乎if感到困惑并认为“好吧,我不知道 - 给它一个真实的”。(使用neq, gtr,lss而不是equ, geq,leq总是给出 FALSE)。
如果任何一个a和/或b在 32 位整数的边界内或包含 [0-9] 之外的任何字符,则代码按预期工作。
@echo off
set a=333333333333
set b=444444444444
call :compare
set b=222222222222
call :compare
goto :eof
:compare
echo comparing %a% with %b%
if %a% geq %b% (echo a ^>= b) else (echo -)
if %b% geq %a% (echo b ^>= a) else (echo -)
if %a% leq %b% (echo a ^<= …Run Code Online (Sandbox Code Playgroud) 我最近在文章“ 查找子字符串是否在字符串中(而不是在文件中)”中发现
@setlocal enableextensions enabledelayedexpansion
@echo off
set str1=%1
if not x%str1:bcd=%==x%str1% echo It contains bcd
endlocal
Run Code Online (Sandbox Code Playgroud)
然后
在
x平等的双方之前是要确保字符串bcd工作好。它还可以防止某些“不合适的”起始字符。
但是,我还没有找到关于this实际效果的任何解释x。那么x"%string%"和之间有什么区别"%string%"?
这是删除当前文件夹中除bat文件之外的所有文件的方法:
forfiles /c "cmd /c if @isdir equ FALSE if /i not @ext==\"bat\" del @file"
Run Code Online (Sandbox Code Playgroud)
(我在这里找到它)。
正如我发现的那样,如果更改FALSE为false,它将无法正常工作。为什么?这是我的主要问题。
另外,旁边的问题。是正确的,第一个代码等于:
forfiles /c "cmd /c if @isdir==FALSE if /i not @ext==\"bat\" del @file"
Run Code Online (Sandbox Code Playgroud)
?