【问题标题】:What is this "FOR" command in windows batch file doing?Windows批处理文件中的这个“FOR”命令是做什么的?
【发布时间】:2018-09-26 18:51:03
【问题描述】:
for /F %%i in ("%dist_exe_source%") do set dist_exe=%%~nxi

我对在字符串中检查的内容以及在 dist_exe 中设置的内容感到困惑?

我已经深入研究了命令提示符帮助,但我仍然对这一行中实际发生的情况感到困惑。

提前致谢


编辑

背景:在发布了一些 cmets 之后,我想提供更多信息。我正在处理我继承的应用程序。此应用程序是使用 Qt IDE 编写的。该应用程序是客户测试和与我们的产品交互的一种方式。批处理文件是“自定义构建步骤”过程的一部分,该过程调用该文件以及两个参数,这些参数是如下路径。

scripts\windows_collect_files_to_package.bat build\release\unpacked release\application.exe

完整代码在这里:

:: the directory that this script was started in
set cur_dir=%cd%

:: the directory where all the files that need to be packaged will be placed
set dist_dir=%1

:: the exe to find needed dlls for
set dist_exe_source=%2

for /F %%i in ("%dist_exe_source%") do set dist_exe=%%~nxi

:: clean up any leftovers...
rmdir /q /s %dist_dir%

:: copy all the dlls and other stuff to dist_dir...
mkdir %dist_dir%
copy /y %dist_exe_source% %dist_dir%
cd %dist_dir%
windeployqt --compiler-runtime %dist_exe% 
cd %cur_dir%

批处理文件最终将应用程序所需的文件依赖项分组到特定目录中。然后它运行 windeployqt.exe(这是来自 Qt for windows 平台的部署命令)。

我的问题是了解 for 循环在做什么,以便我可以记录整个过程。

【问题讨论】:

  • 我会假设源变量具有文件的完整路径,并且FOR 命令正在读取该变量,而 set 命令仅获取文件名而没有路径。
  • 如果没有任何进一步的上下文,很难确定地解释该行在做什么。在到达此行之前,代码中的%dist_exe_source% 设置为什么?
  • 我认为这是不正确的。如果变量%dist_exe_source% 的值是一个可执行命令,它应该读取For /F "Delims=" %%A In ('"%dist_exe_source%"') Do Set "dist_exe=%%~nxA",其中新变量%dist_exe% 将保存从命令返回的文件名和扩展名。如果变量%dist_exe_source% 的值只是一个带有路径的可执行文件名,则它应为For %%A In ("%dist_exe_source%") Do Set "dist_exe=%%~nxA",其中新变量%dist_exe% 将保存%dist_exe_source% 值的文件名和扩展名部分。
  • @KenWhite dist_exe_source 设置为可执行文件:set dist_exe_source=\release\application.exe。它被设置为命令行的参数;所以批处理文件行实际上设置为dist_exe_source=%2。第二个论点其实是我上面写的。
  • @N.Dijkhoffz Compo 是绝对正确的。命令不正确。应该是for %%i in ("%dist_exe_source%") do set "dist_exe=%%~nxi" 来获取分配给环境变量dist_exe 的文件名和文件扩展名,而不需要相对或绝对路径。此处不需要选项/F,如果可执行文件的路径包含空格字符,则可能会产生错误结果,正如 Compo 解释的那样。有关命令 FOR 的帮助,请打开命令提示符窗口并运行 for /?,它会在多个页面上输出此命令的帮助。

标签: batch-file for-loop


【解决方案1】:
for /F %%i in ("%dist_exe_source%") ...

假设%dist_exe_source% 不为空,每个%%i 将是一个空格分隔的段,取自dist_exe_source 中存储的任何字符串。

... do set dist_exe=%%~nxi

%%i 中去掉所有引号,然后解析它可以找到的任何name.ext。使用测试变量从命令行进行的快速测试表明,如果%dist_exe% 解析为JustAName,您将从%~nxi 获得JustAName,因此它基本上会从字符串中去除引号和任何前导驱动器/路径数据。

【讨论】:

  • dist_exe_source 只是可执行文件。是把整个可执行文件复制到dist_exe吗?
  • @N.Dijkhoffz,它有效地从源字符串中去除引号和路径,留下filename.ext。有关替换变量修饰符的说明,请参见 help for
  • 哦,我现在明白了。所以 dist_exe = 文件名.ext。现在我明白了。谢谢。
【解决方案2】:
:: get just the filename.ext from exe path
for %%i in ("%dist_exe_source%") do set "dist_exe=%%~nxi"

不需要/f 参数。一个简单的for 循环可以解析可执行文件 路径并使用nx的修饰符从路径中获取filename.ext。

本例中for循环的操作,是字符串操作 使用修饰符获取路径的各个部分。没有实际复制或其他 操作正在进行中。

在代码中添加了注释以描述该行。

【讨论】:

    猜你喜欢
    • 2021-05-23
    • 2011-09-20
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多