【问题标题】:Batch file variable value not available until outside of loop批处理文件变量值直到循环外才可用
【发布时间】:2013-09-27 21:49:18
【问题描述】:

我正在尝试编写一个批处理文件,该文件将在目录中搜索 *.pdf 文件扩展名,然后使用 ImageMagic 将它们转换为 *.tif 文件扩展名。如果目录中有一个 PDF 文件,我可以做到这一点,但如果有多个,我不知道如何用正确的名称转换它们。问题在于循环内fName 变量似乎没有被赋值,但循环外,它有一个值...

这是适用于单个 PDF 文件并适用于多个文件的代码,但名称包含“.pdf”:

echo off
set dSource=C:\Users\Nick\Documents\Research\Journal Article\Figures
set fType=*.pdf
for /f "delims=" %%f in ('dir /a-d /b "%dSource%\%fType%"') do (
    rem remove extension from file name, set value to variable:
    set fName=%%~nf

    rem call ImageMagic to convert to TIFF
    rem convert -compose copy -density 300 -alpha off "%%f" "%%f.tif"
    rem above line (when uncommented) lets multiple TIFF images to be produced, but they are *.pdf.tif

    rem convert -compose copy -density 300 -alpha off "%fName%.pdf" "%fName%.tif"
    rem above line (when uncommented) does not work because fName has no value...

    rem variable value does not appear to be assigned within loop:
    echo.file name within loop: %fName%
)
echo.file name after loop: %fName% 
rem outside loop, variable value is now available...
rem convert -compose copy -density 300 -alpha off "%fName%.pdf" "%fName%.tif" 
rem above line of code works, but only for the last file name with *.pdf discovered in directory
pause

【问题讨论】:

  • 你的 for 循环中有那个 'convert' 语句吗?
  • 嘿@kenny,是的,我希望循环中的转换语句转换多个数字。

标签: variables batch-file for-loop


【解决方案1】:

如果需要设置变量并在同一个循环中使用,则启用延迟扩展,然后使用!而不是%引用循环中的变量:

@echo off
setlocal ENABLEDELAYEDEXPANSION
set dSource=C:\Users\Nick\Documents\Research\Journal Article\Figures
set fType=*.pdf
for /f "delims=" %%f in ('dir /a-d /b "%dSource%\%fType%"') do (
    set fName=%%~nf
    echo fName in the loop:  !fName!
)
echo fName out of the loop:  %fName%

谷歌“批量延迟扩展”了解详情。

【讨论】:

    【解决方案2】:

    在您的情况下,解决方案是替换它:

    convert -compose copy -density 300 -alpha off "%%f" "%%f.tif"
    

    用这个:

    convert -compose copy -density 300 -alpha off "%%f" "%%~dpnf.tif"
    rem or "%%~nf.tif" to save them all in the current folder.
    

    延迟扩展的缺点是! 字符在文件名、路径或字符串中变得更难处理。

    【讨论】:

    • 感谢您回复@foxidrive,这也是一个有效的解决方案。我最初想将文件名存储在一个变量(数组?)中,所以我可以在循环之外访问它们以通过批处理文件使用 IrfanView 进行编辑,但到目前为止,这还没有被证明是必要的,因为我可以添加代码在现有循环中!
    猜你喜欢
    • 1970-01-01
    • 2021-03-16
    • 2013-08-08
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 2021-11-04
    相关资源
    最近更新 更多