每当我输入一个(
,即一个左括号在里面命令提示符, 有时候是这样的:
(
More?
如果我继续打字(
或者 任何其他字符,它会提示我同样的消息。这已停止,如果我输入)
,即右括号,但我确实收到了一个错误,内容是:
) was unexpected at this time
除此之外,我找不到此命令的作用. 知道它有什么用处吗?
答案1
() 实际上并不是一个命令,而是一个分组运算符,它允许您将一系列命令组合在一起,以便在 CMD shell 通常期望出现单个命令
的位置使用它。 () 之间的命令实际上是在单独的 CMD 实例中执行的。当您手动输入“(”时,您会进入该新实例并等待您的命令。
if not exist c:\myfile (
echo File doesn't exist
) else (
echo File DOES exists
del c:\myfile
)
请注意,通常 IF ELSE 应该在同一行,并且您只能在 THEN 和 ELSE 子句中运行单个命令。
使用“()”将整个 (xxxxx) 块视为单个命令,甚至就像它出现在同一行一样。
答案2
这里已经发布了很多有用的信息——例如,括号是“分组运算符允许你将一系列命令组合在一起,以便在 CMD shell 通常期望出现单个命令的位置使用它”那“就像开始块和结束块”—但一些简单的事情却被忽略了:
1. 如何避免出现“此时出现意外”错误
您只需在提示符下输入命令即可获得一些有用的结果More?
:
C:\> (
More? date /t
More? )
Tue 04/11/2017
C:\> (
More? dir \Windows\win.ini
More? )
Volume in drive C is OS
Volume Serial Number is ▒▒▒▒-▒▒▒▒
Directory of C:\Windows
08/13/2014 12:26 PM 435 win.ini
1 File(s) 435 bytes
0 Dir(s) ▒▒▒,▒▒▒,▒▒▒,▒▒▒ bytes free
C:\>
您可以在单独的行中输入多个命令,并且可以将其移动)
到最后一行的末尾:
C:\> (
More? date /t
More? time /t
More? )
Tue 04/11/2017
06:18 PM
C:\> (
More? date /t
More? time /t)
Tue 04/11/2017
06:18 PM
C:\>
(
2.和如何)
影响命令的含义?
正如其他人指出的那样,有如下命令
C:\> for %f in (\Windows\*.dll) do @echo %f
其中(
...)
是命令本身语法的一部分(FOR
在本例中为 )。如果删除括号,则会出现语法错误。我不是在谈论这个。
就像声明的那样令人厌烦, 括号团体命令。考虑这个命令行:
echo cat & echo dog | findstr /n a
它的意思是
- 执行
echo cat
,然后 - 由于
echo dog | findstr /n a
单词“dog”不包含字母“a”,因此该命令不会产生任何输出。
因此,上述输出为
C:\> echo cat & echo dog | findstr /na 猫
相似地,
C:\> echo cat & echo dog | findstr /no 猫 1:狗
其中我们得到了额外的1:dog
输出,因为“dog”做包含“o”,并且“dog”是第一个(1st) 命令的输入行findstr
。
现在考虑
(echo cat & echo dog) | findstr /n a
(与上面相同,但增加了括号),这意味着
- 做
echo cat
,
然后
做echo dog
,然后 - 将上面的输出导入到
findstr /n a
所以,
C:\> (echo cat & echo dog) | findstr /na 1:猫 C:\> (echo cat & echo dog) | findstr /no 2:狗
因为命令行左侧(#1)的输出是
cat
dog
并且在线上找到“a”1在该文本中,并且“o”位于第 3 行2。我们不再得到只显示cat
(没有行号)的输出行,因为echo cat
不再是一个独立的命令,而是团体构成管道的左侧。
以下是命令分组的一个更简单的示例:
C:\Temp> echo cat & echo dog > animals
cat
C:\Temp> type animals
dog
C:\Temp> (echo cat & echo dog) > animals
C:\Temp> type animals
cat
dog
当然,如上和其他答案所示,您可以在组内添加换行符:
C:\> ( 更多?echo cat 更多?echo dog 更多?)| findstr /na 1:猫
3. 括号是否会创建 CMD 的新实例?
我不这么认为;没有任何明显的、有意义的方式:
C:\> (cd windows)
C:\Windows> set a=aardvark
C:\Windows> (set a=bat)
C:\Windows> echo %a%
bat
请注意,cd
括号中的 会更改主 CMD 进程的工作目录,并且set
括号中的 会覆盖括号外设置的变量值。
答案3
( 和 ) 类似于begin block
和end block
。任何可以放入批处理文件 (.bat) 的内容都可以输入到命令行中。
例如,我可以编写一个批处理文件,其中可以将一组语句放入if
:
if "%1"=="" (
echo Multiple
echo Lines when no parameter
)
echo END
(
现在,当我运行不带参数的批处理时,我会获得和运行之间的所有命令)
。当提供第一个参数时,唯一的输出是“END”。
现在回到命令行:我不知道有什么技巧或技术可以通过直接在命令行上输入来实际使用它。但它确实遵循相同的规则。在命令行上输入以下内容:
(echo "1" & echo "2")
输出为:
1
2