gpt4 book ai didi

loops - 为什么%CD%在PushD的for循环中不起作用

转载 作者:行者123 更新时间:2023-12-01 11:34:02 25 4
gpt4 key购买 nike

我想运行一个.bat脚本来制作一个文件,并使用与它所在的文件夹相同的名称进行保存。我希望它从一个地图开始并遍历子地图。
我从下面的代码开始,并在其中一个子图中运行它。可行,我得到一个带有子图名称的文件。

FOR /D %%I IN ("%CD%") DO SET _LAST_SEGMENT_=%%~nxI
ECHO Last segment = "%_LAST_SEGMENT_%"
echo.>%_LAST_SEGMENT_%.mp4
pause

所以现在我只需要将它放在for循环中即可。所以我做了下面的代码,这是行不通的。似乎 %CD%指的是 .bat文件所在的父地图(子文件夹),而不是我的子地图(video1,video2等)。
Set Base=C:\Video\subfolders
FOR /R "%Base%" %%F IN (.) DO (
PushD "%%F"
FOR /D %%I IN ("%CD%") DO SET _LAST_SEGMENT_=%%~nxI
echo %CD%
ECHO Last segment = "%_LAST_SEGMENT_%"
echo.>%_LAST_SEGMENT_%.mp4
PopD
)
Pause

输出:
C:\Video\subfolders>Set Base=C:\Video\subfolders
C:\Video\subfolders>FOR /R "C:\Video\subfolders" %F IN (.) DO (
PushD "%F"
FOR / %I IN ("C:\Video\subfolders") DO SET _LAST_SEGMENT_=%~nxI
echo C:\Video\subfolders
ECHO Last segment = ""
echo. 1>.mp4
PopD
)
C:\Video\subfolders>(
PushD "C:\Video\subfolders\."
FOR / %I IN ("C:\Video\subfolders") DO SET _LAST_SEGMENT_=%~nxI
echo C:\Video\subfolders
ECHO Last segment = ""
echo. 1>.mp4
PopD
)
C:\Video\subfolders>SET _LAST_SEGMENT_=subfolders
C:\Video\subfolders
Last segment = ""
C:\Video\subfolders>(
PushD "C:\Video\subfolders\video1\."
FOR / %I IN ("C:\Video\subfolders") DO SET _LAST_SEGMENT_=%~nxI
echo C:\Video\subfolders
ECHO Last segment = ""
echo. 1>.mp4
PopD
)
C:\Video\subfolders\video1>SET _LAST_SEGMENT_=subfolders
C:\Video\subfolders
Last segment = ""
C:\Video\subfolders>(
PushD "C:\Video\subfolders\video2\."
FOR / %I IN ("C:\Video\subfolders") DO SET _LAST_SEGMENT_=%~nxI
echo C:\Video\subfolders
ECHO Last segment = ""
echo. 1>.mp4
PopD
)
C:\Video\subfolders\video2>SET _LAST_SEGMENT_=subfolders
C:\Video\subfolders
Last segment = ""
C:\Video\subfolders>(
PushD "C:\Video\subfolders\video3\."
FOR / %I IN ("C:\Video\subfolders") DO SET _LAST_SEGMENT_=%~nxI
echo C:\Video\subfolders
ECHO Last segment = ""
echo. 1>.mp4
PopD
)
C:\Video\subfolders\video3>SET _LAST_SEGMENT_=subfolders
C:\Video\subfolders
Last segment = ""
C:\Video\subfolders>Pause
Press any key to continue . . .

我看到了下面的链接,该链接解释了如何使用 setlocal enabledelayedexpansion,但无法正常使用。

https://superuser.com/questions/503488/why-doesnt-cd-work-after-using-pushd-to-a-unc-path

任何意见,将不胜感激

最佳答案

您似乎想要以下内容:

@echo off
for /F "delims=" %%I in ('dir "C:\Video\subfolders\*" /AD-H /B /S 2^>nul') do (
pushd "%%I"
echo/>"%%~nxI.mp4"
popd
)

如下面的代码所示,实际上不需要使用 pushdpopd命令:
@echo off
for /F "delims=" %%I in ('dir "C:\Video\subfolders\*" /AD-H /B /S 2^>nul') do (
echo Directory is: %%I
echo/>"%%I\%%~nxI.mp4"
)

命令 FOR 在命令行中以 cmd.exe /C开头的单独命令进程中运行,并在后台命令行中运行:
dir "C:\Video\subfolders\*" /AD-H /B /S 2>nul

命令 DIR 输出以处理此后台命令过程的 STDOUT

由于选项 /B
  • 以裸格式出现,由于选项/S
  • 仅具有完整路径的所有名称
    由于选项 /AD-H(属性目录且未隐藏)而导致的非隐藏目录的

  • 指定目录C:\Video\subfolders及其所有子目录中的

  • 通过将 DIR 重定向到设备 NUL ,可以抑制 DIR 输出的错误消息,该错误消息在未在 C:\Video\subfolders的整个目录树中找到任何目录条目时处理 STDERR

    阅读有关 Using Command Redirection Operators的Microsoft文章,以获取 2>nul的解释。当Windows命令解释器在执行命令 FOR 之前执行Windows命令行解释程序处理的命令行时,重定向操作符 >必须在 FOR 命令行上使用脱字符号 ^进行转义,以将其解释为文字字符在背景中。

    FOR 将输出捕获到已启动命令进程的 STDOUT 中,并逐行处理此输出,而忽略空行,并且默认情况下还以分号开头的行在此都不会出现。

    FOR 还将每行分成空格/制表符的子字符串,并将仅第一个空格/制表符分隔的字符串分配给指定的循环变量 dir。目录名可以有空格,因此 I用于定义一个空的字符串定界符列表,从而导致始终将捕获的 DIR 输出中当前处理的完整合格目录名分配给循环变量 delims=

    不带路径的目录名称由 I引用,它是最后一个反斜杠之后的字符串。目录名称也可以包含点,例如 %%~nxI或以点开头(例如 folder.name),尽管两者在Windows上都是不常见的。因此,有必要使用 .FolderName(名称和扩展名),而不仅仅是 %%~nxI,因为 。FOR 不会验证 %%~nI引用的字符串是否是文件名或目录名。

    如果在所有 或所有字符串的开头都存在反斜杠(或斜杠),而没有%%I(或%%~nI),则\引用最后一个 /(或 \与Linux路径兼容性首先由 \替换)之间的字符串 。如果已经确定了名称字符串的开头,则最后一个点,如果没有点,则最后一个点。 /引用以最后一个目录分隔符之后找到的最后一个点开头的字符串。因此,分配给循环变量 .的字符串一定不能是实际存在的文件/文件夹的文件/文件夹名称,尽管在这种情况下是这样。如果 %%~xI包含以 I(或 %%~nxI)结尾的字符串,则 I将为空字符串。

    请勿将可以使用不带或不带修饰符的循环变量引用的字符串分配给环境变量,因为这将需要使用 delayed expansion,如在命令提示符窗口 \中运行时通过命令 SET 输出帮助所说明的那样。

    为了了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
  • /
  • set /?
  • dir /?
  • echo /?
  • for /?

  • 另请参阅DosTips论坛主题 ECHO. FAILS to give text or blank line - Instead use ECHO/

    有问题的第二批处理文件代码不起作用,因为未使用延迟扩展,或者避免使用在命令块内定义/修改并在同一命令块内使用语法 popd /?引用的环境变量。 Windows命令处理器 pushd /?在第一次执行外部 FOR 之前,将整个命令块从第一个 FOR %variable%解析为匹配的 cmd.exe。请参见 How does the Windows Command Interpreter (CMD.EXE) parse scripts?。在此预处理阶段,此命令块内的所有 (引用已被引用的环境变量的当前值替换。因此,最终迭代外部 FOR 所执行的代码不再包含任何 )环境变量引用,因为在执行命令行之前,可以在 %variable%输出的命令行上看到它。

    关于loops - 为什么%CD%在PushD的for循环中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53632541/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com