Windows FINDSTR命令可怕地记录在案.有一个非常基本的命令行帮助可用FINDSTR /?,或者HELP FINDSTR,但是它非常不合适.在https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/findstr上有更多的在线文档.
有许多FINDSTR功能和限制甚至在文档中都没有暗示.如果没有先前的知识和/或仔细的实验,他们也无法预料到.
所以问题是 - 未记录的FINDSTR功能和限制是什么?
此问题的目的是提供许多未记录的功能的一站式存储库,以便:
A)开发人员可以充分利用那里的功能.
B)开发人员不要浪费时间,想知道为什么某些东西看起来不应该起作用.
在回复之前,请确保您知道现有文档.如果HELP涵盖了这些信息,则它不属于此处.
这也不是展示FINDSTR有趣用途的地方.如果逻辑人员可以根据文档预测FINDSTR的特定用法的行为,那么它不属于此处.
同样,如果逻辑人员可以基于任何现有答案中包含的信息预测特定用法的行为,那么再次,它不属于此处.
人们已经在批处理文件中嵌入和执行VBScript很长一段时间了.但是我所看到的所有已发布的解决方案(在此问题最初提出时)都涉及编写临时VBS文件.例如:在Windows批处理文件中嵌入VBScript.
是否可以在批处理中执行嵌入式VBScript而无需编写临时文件?
这是一个简单的批处理文件,它演示了如果延迟扩展在正在通过管道传输的块中,它将如何失败.(失败是在脚本的末尾)任何人都可以解释为什么这是?
我有一个解决方法,但它需要创建一个临时文件.我最初在查找文件时遇到了这个问题,并在Windows批处理文件中按大小排序
@echo off
setlocal enableDelayedExpansion
set test1=x
set test2=y
set test3=z
echo(
echo NORMAL EXPANSION TEST
echo Unsorted works
(
echo %test3%
echo %test1%
echo %test2%
)
echo(
echo Sorted works
(
echo %test3%
echo %test1%
echo %test2%
) | sort
echo(
echo ---------
echo(
echo DELAYED EXPANSION TEST
echo Unsorted works
(
echo !test3!
echo !test1!
echo !test2!
)
echo(
echo Sorted fails
(
echo !test3!
echo !test1!
echo !test2!
) | sort
echo(
echo …Run Code Online (Sandbox Code Playgroud) Windows批处理编程是否支持异常处理?如果没有,有没有办法有效地模拟批处理文件中的异常处理?
我希望能够在任何CALL级别的批处理脚本中的任何地方"抛出异常",并重复弹出CALL堆栈,直到它找到一个活动的"TRY块",于是"CATCH块"可以处理异常完全继续,或做一些清理并继续弹出CALL堆栈.如果永远不处理异常,则终止批处理并且控制返回到命令行上下文并显示错误消息.
已经有几种方法可以在任何CALL深度上终止批处理,但这些技术都不允许通过异常处理通常在其他语言中提供的任何结构化清理活动.
注意: 这是我已经知道最近才被发现的好答案的情况,我想分享这些信息
在Windows批处理文件中,我接受来自用户输入的变量set /p var1=,在var1使用之后,我不知道如何重置/清除其值.
如果我没有重置/清除其值,当用户set /p var1=再次见面时,用户直接进入.之前的输入值仍然存在.我不想要它,如何为新用户输入重置它?
在Windows批处理脚本中处理错误的常用方法是使用
if errorlevel 1 ...或等if %errorlevel% neq 0 ....通常,人们希望错误处理代码保留ERRORLEVEL.
我相信所有外部命令总是会导致ERRORLEVEL被设置为某个值,因此错误处理代码必须在执行外部命令之前在环境变量中保留ERRORLEVEL.
但内部命令怎么样?问题是,一些内部命令在成功时将ERRORLEVEL清除为0,而有些则没有.而且我找不到任何指定哪些命令做什么的文档.
所以问题是,哪些内部命令成功后将ERRORLEVEL清除为0?这不是关于返回的ERRORLEVEL代码的一般问题,而是严格关于成功结果的问题.
有些帖子如何将ERRORLEVEL重置为零的最简单方法是什么?和Windows批处理文件:.bat vs .cmd?给出部分答案.但我从未见过全面的清单.
注意: 多年来我一直很好奇.所以我最终决定进行一系列实验并得出一个明确的答案.我发布此问答来分享我发现的内容.
在下面提供的示例中,我执行nmake然后将STDOUT/STDERR重定向到tee,然后将其发送到屏幕,还发送到日志文件.问题是我正在尝试捕获nmake的退出代码而不是tee.我需要的是nmake的退出代码,而不是tee.
nmake | tee output.txt
Run Code Online (Sandbox Code Playgroud) 我在这里搜索,发现有人用这个
set is_dir=0
for %%i in ("%~1") do if exist "%%~si"\nul set is_dir=1
Run Code Online (Sandbox Code Playgroud)
但没有工作,当时%1==c:\this is a file with spaces.csproj,测试仍然成功,这意味着它仍将被视为文件夹!!!
任何人都知道答案,我想这是一个非常普遍的问题,Windows已存在多年,它应该有一个非常简单的解决方案....
注意 - 此问题基于在Windows 7上观察到的行为.我认为该行为适用于从Vista开始的所有其他版本.基于MC ND的答案和Foxidrive的评论,它不适用于XP.
我可以使用伪动态变量%CD%来获取当前目录,而不是尾随\.如果我定义一个名为CD using的真实变量set "CD=someValue",则%CD%返回我指定的值,而不是当前目录.
一个鲜为人知的动态变量是%__CD__%相同的%CD%,除了它包括尾部\.但是,如果我这样做set "__CD__=someValue",我无法访问我指定的值!我可以set __CD__看到我的变量存在我的指定值,但%__CD__%总是返回当前目录!
有没有人知道这个%__CD__%机制是如何工作的(为什么它与任何其他动态变量不同)?
有人能想出一种方法来__CD__使用标准批处理命令(不解析输出set __CD__)来访问我的变量吗?
这更像是一个学术问题,而不是一个实际问题.没有人应该定义名称与动态变量匹配的变量.
我不希望解析结果的例程的原因set __CD__是因为值可以在其中包含换行符.有人可以定义两个变量,__CD__或者__CD__2,或者他们可以定义__CD__一个包含换行后跟的值__CD__2=....要区分这两种情况是不可能的.(正如我所说,这是一个学术问题,而不是一个实际问题!)