我有一个程序的长路径名,我必须在for/f循环中运行,其中包括一个右括号")",我需要从中解析输出:
for /f "tokens=1" %%G in ('"C:\Documents and Settings\myaccount\Desktop\Test_release (x86)\program.exe" list') do (echo Will do something with %%G)
Run Code Online (Sandbox Code Playgroud)
...'list'是传递给我程序的参数.我收到错误"'C:\ Documents'不被识别为内部或外部命令,可操作程序或批处理文件."
我知道问题是,右括号实际上关闭了"for"块,因此结尾的双引号不是"看到"的,所以长路径名不再包含在双引号内.我不明白的是为什么会发生这种情况,因为我的路径是用双引号括起来的?我也尝试了usebackq选项:
for /f "usebackq tokens=1" %%G in (`"C:\Documents and Settings\myaccount\Desktop\Test_release (x86)\program.exe" list`) do (echo Will do something with %%G)
Run Code Online (Sandbox Code Playgroud)
......没有更好的结果.我试图逃避这样的"^)"或像这样的"^^)",无所事事.尝试加倍双引号:
for /f "tokens=1" %%G in ('""C:\Documents and Settings\myaccount\Desktop\Test_release (x86)\program.exe"" list') do (echo Will do something with %%G)
Run Code Online (Sandbox Code Playgroud)
仍然无法正常工作.
此外,我实际上使用了一个保存路径的变量,这个变量事先不知道(从%CD%构建),并且激活了EnableDelayedExpansion.我尝试了延迟扩展(在其他情况下修复了类似的问题)以防止变量在读取时扩展并在执行时延迟它:
setlocal EnableDelayedExpansion
set _var=%CD%\program.exe
@REM _var now contains C:\Documents and Settings\myaccount\Desktop\Test_release (x86)\program.exe
for /f "tokens=1" %%G …Run Code Online (Sandbox Code Playgroud) 假设我有变量a与内容" 123 "和变量b123与其中的一些文本.出于某种原因,我想使用变量a作为第二个var名称的一部分.像这样的东西:
SET a=123
SET b123=some_text_in_it
rem i want next line to output "some_text_in_it"
echo %b%a%%
Run Code Online (Sandbox Code Playgroud)
所以我想将文本与var内容连接起来,并使用结果字符串作为变量名称来回显该内容.上面的示例不起作用,我明白为什么,可能我需要添加一些灌浆.怎么做,最好在一条线上?
我正在尝试回显存储在变量中的字符串,但它似乎需要大量的转义.我正在尝试使用以下代码:
setlocal EnableDelayedExpansion
@echo off
set "grass=@##&!$^&%**(&)"
echo !grass!
Run Code Online (Sandbox Code Playgroud)
我想grass逐字回显变量,所以我@##&!$^&%**(&)在输出中看到了一个.应该做什么?谢谢!
在试图为为什么FindStr返回未找到问题提供全面的答案时,我遇到了涉及管道的代码的奇怪行为。这是一些基于原始问题的代码(将在批处理文件中执行):
rem // Set variable `vData` to literally contain `...;%main%\Programs\Go\Bin`:
set "vData=...;%%main%%\Programs\Go\Bin"
set "main=C:\Main"
echo/%vData%| findstr /I /C:"%%main%%\\Programs\\Go\\Bin"
Run Code Online (Sandbox Code Playgroud)
这并没有返回匹配,因此没有什么呼应和ErrorLevel被置1 1。
尽管当我逐步进行解析过程时,我得出相反的结论,但是我确实期望有一个匹配项和一个匹配ErrorLevel项0,因为:
首先,将对整个行进行解析,然后进行即时(%)扩展,因此%vData%将其扩展并%%替换为%,从而将执行以下命令行:
echo/...;%main%\Programs\Go\Bin| findstr /I /C:"%main%\\Programs\\Go\\Bin"
Run Code Online (Sandbox Code Playgroud)管道的每一端|都在自己的新cmd实例中执行cmd /S /D c,这两个实例均在cmd上下文中运行(这会影响%-expansion的处理),从而产生以下部分:
管道的左侧:
echo/...;C:\Main\Programs\Go\Bin
Run Code Online (Sandbox Code Playgroud)管道的右侧:
findstr /I /C:"C:\Main\\Programs\\Go\\Bin"
Run Code Online (Sandbox Code Playgroud)
(即搜索字符串findstr最后采用的是C:\Main\Programs\Go\Bin作为\即使在文字搜索模式用作转义字符,/C或/L) …
我正在阅读一篇关于ss64关于命令提示符中的环境变量的文章。
本文后面有一个表,其中列出了命令提示符中常见的环境变量。其中列出的一些变量被称为易失性(只读)。文章中的一句话指出:-
动态环境变量是只读的,并且每次扩展变量时都会进行计算。当所有变量都用 SET 列出时,这些变量将不会出现在列表中。不要尝试直接设置动态变量。
后两句话我明白了。但我无法理解第一个。
疑问:-
%userprofile%是非易失性变量,解析为%SystemDrive%\Users\{username},%homepath%是易失性变量,解析为Users\{Username}。这两个命令非常相似(除了systemdrive)。那为什么一个是易失性的,另一个是非易失性的呢?
变量动态的标准是什么?是什么使%appdata%(只是一个例子)成为非易失性变量?
每次扩展变量时都会计算动态变量,这对于诸如此类的变量是有意义的,%CD% %DATE% %TIME% %RANDOM%因为如果它们是非易失性的,它们就会失去其功能。但效果如何呢%homepath%?
一些非易失性变量中含有某种动态成分。前任。%userprofile%有%SystemDrive%并且{username}在它的路径中。那么这些变量怎么不是动态的呢?
当我输入:
set hi=Hello^&World!
echo %hi%
Run Code Online (Sandbox Code Playgroud)
打印Hello并告诉我World不是命令
我想要它打印Hello&World!
这该怎么做?
基本上我正在尝试!var1:SomeText =!var2 !! 但是这段代码不起作用.我错过了什么?
variables substring batch-file delayedvariableexpansion windows-scripting
在我的桌面上,有一个名为"test"的文件夹.在这个文件夹里面有两个文件,"file1.txt"和"file2.txt".
看看这个简单的批处理脚本:
@ECHO OFF
SET test="C:\Users\Tyler\Desktop\test"
ECHO %test%
FOR /R %test% %%F IN (*) DO (
ECHO %%F
)
Run Code Online (Sandbox Code Playgroud)
正如您所料,它输出以下内容:
"C:\Users\Tyler\Desktop\test"
C:\Users\Tyler\Desktop\test\file1.txt
C:\Users\Tyler\Desktop\test\file2.txt
Run Code Online (Sandbox Code Playgroud)
现在来看看这个变化:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET test="C:\Users\Tyler\Desktop\test"
ECHO !test!
FOR /R !test! %%F IN (*) DO (
ECHO %%F
)
ENDLOCAL
Run Code Online (Sandbox Code Playgroud)
我希望它的输出没有什么不同.但是,这里是:
"C:\Users\Tyler\Desktop\test"
Run Code Online (Sandbox Code Playgroud)
它似乎在线上!test!扩展ECHO !test!,但不FOR /R !test!在线,变得公正!test!.因为那当然不是有效路径,FOR/R循环永远不会迭代.
为什么是这样?我错过了什么?
我认为我对ERRORLEVEL与%ERRORLEVEL%有基本的了解,但是!ERRORLEVEL!使我困惑。
我正在制作一个脚本,该脚本调用可执行文件,然后任务列表以查看其是否正在运行,然后通过taskkill将其杀死,然后尝试输出错误级别并针对其他exe重复此操作,而我意识到我真的不明白批处理中的错误级别。
我将变量设置为!errorlevel!然后在回显中使用不带引号的变量,并且在设置后出现错误时,变量从一个uint16更改为另一个uint16,例如它引用了真实的变量而不是副本。我要复制。有人可以解释这些家伙之间的区别吗?
更新:这是我正在处理的代码段。
for %%P in (%executableList%) do (
echo ----------------------------------------------------------------------------------
set exeErrorlevel=0
set running=false
start %%~fP
set exeErrorlevel=!ERRORLEVEL!
rem for debugging purposes
echo %%~nP%%~xP older errorlevel %ERRORLEVEL%
echo %%~nP%%~xP newer errorlevel !ERRORLEVEL!
echo before tasklist running var is : !running!
tasklist /FI "IMAGENAME eq %%~fP" | find /I /N /C "%%~fP" >nul && set running=true
echo after tasklist is running var is: !running!
if !running! equ true (
echo %%~nP%%~xP Program is running
taskkill /F /IM %%~nP%%~xP /T …Run Code Online (Sandbox Code Playgroud) 我注意到在windows批处理文件中,即使你退出%〜你也会得到错误
For valid formats type CALL /? or FOR /?
The syntax of the command is incorrect.
Run Code Online (Sandbox Code Playgroud)
为什么注释行不被忽略?
@ ECHO OFF
REM Blah blah blah
REM %~ this will cause an error
REM %%~ Double the fun, no error
Run Code Online (Sandbox Code Playgroud) batch-file ×9
cmd ×5
windows ×3
for-loop ×2
variables ×2
command-line ×1
dos ×1
echo ×1
errorlevel ×1
escaping ×1
findstr ×1
quotes ×1
substring ×1