相关疑难解决方法(0)

如何处理for循环中路径名中的右括号?

我有一个程序的长路径名,我必须在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)

quotes for-loop cmd batch-file

5
推荐指数
1
解决办法
7600
查看次数

BAT文件:变量内容作为另一个变量的一部分

假设我有变量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内容连接起来,并使用结果字符串作为变量名称来回显该内容.上面的示例不起作用,我明白为什么,可能我需要添加一些灌浆.怎么做,最好在一条线上?

variables batch-file

5
推荐指数
1
解决办法
1万
查看次数

在Windows批处理文件中回显精确字符串?

我正在尝试回显存储在变量中的字符串,但它似乎需要大量的转义.我正在尝试使用以下代码:

setlocal EnableDelayedExpansion
@echo off
set "grass=@##&!$^&%**(&)"
echo !grass!
Run Code Online (Sandbox Code Playgroud)

我想grass逐字回显变量,所以我@##&!$^&%**(&)在输出中看到了一个.应该做什么?谢谢!

escaping batch-file

5
推荐指数
1
解决办法
1万
查看次数

当涉及管道时,为什么在搜索字符串中具有可变扩展名的`findstr`返回意外结果?

在试图为为什么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

尽管当我逐步进行解析过程时,我得出相反的结论,但是我确实期望有一个匹配项和一个匹配ErrorLevel0,因为:

  1. 首先,将对整个行进行解析,然后进行即时(%)扩展,因此%vData%将其扩展并%%替换为%,从而将执行以下命令行:

    echo/...;%main%\Programs\Go\Bin| findstr /I /C:"%main%\\Programs\\Go\\Bin"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 管道的每一端|都在自己的新cmd实例中执行cmd /S /D c,这两个实例均在cmd上下文中运行(这会影响%-expansion的处理),从而产生以下部分:

windows cmd batch-file findstr io-redirection

5
推荐指数
1
解决办法
205
查看次数

CMD中动态环境变量与普通环境变量的区别

我正在阅读一篇关于ss64关于命令提示符中的环境变量的文章。

本文后面有一个,其中列出了命令提示符中常见的环境变量。其中列出的一些变量被称为易失性(只读)。文章中的一句话指出:-

动态环境变量是只读的,并且每次扩展变量时都会进行计算。当所有变量都用 SET 列出时,这些变量将不会出现在列表中。不要尝试直接设置动态变量。

后两句话我明白了。但我无法理解第一个。

疑问:-

  • %userprofile%非易失性变量,解析为%SystemDrive%\Users\{username}%homepath%易失性变量,解析为Users\{Username}。这两个命令非常相似(除了systemdrive)。那为什么一个是易失性的,另一个是非易失性的呢?

  • 变量动态的标准是什么?是什么使%appdata%(只是一个例子)成为非易失性变量?

  • 每次扩展变量时都会计算动态变量,这对于诸如此类的变量是有意义的,%CD% %DATE% %TIME% %RANDOM%因为如果它们是非易失性的,它们就会失去其功能。但效果如何呢%homepath%

  • 一些非易失性变量中含有某种动态成分。前任。%userprofile%%SystemDrive%并且{username}在它的路径中。那么这些变量怎么不是动态的呢?

cmd environment-variables command-prompt

5
推荐指数
1
解决办法
4431
查看次数

如何回显环境变量在DOS批处理中包含'&'?

当我输入:

set hi=Hello^&World!
echo %hi%
Run Code Online (Sandbox Code Playgroud)

打印Hello并告诉我World不是命令

我想要它打印Hello&World!

这该怎么做?

dos batch-file echo

4
推荐指数
2
解决办法
6万
查看次数

4
推荐指数
1
解决办法
2387
查看次数

Windows CMD批处理:具有DelayedExpansion的FOR/R

在我的桌面上,有一个名为"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循环永远不会迭代.

为什么是这样?我错过了什么?

command-line for-loop cmd batch-file variable-expansion

4
推荐指数
1
解决办法
2448
查看次数

ERRORLEVEL与%ERRORLEVEL%与感叹号ERRORLEVEL感叹号

我认为我对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 cmd batch-file errorlevel

4
推荐指数
1
解决办法
3214
查看次数

REM语句中的%〜

我注意到在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)

windows batch-file

4
推荐指数
1
解决办法
476
查看次数