天道酬勤,学无止境

Folder1 and Folder2 logs not showing correctly in Batch files

问题

这应该很简单,但无法正常工作。

FOR /D %%d IN ("D:\Folder*") DO (
    FOR /R "%%d\logs" %%i IN (*) do echo %%i
)
pause

我也试过:

FOR /D %%d IN ("D:\Folder*") DO (
    SET fld=%%d
    FOR /R "%fld%\logs" %%i IN (*) do echo %%i
)
pause

我觉得缺少一些非常基本的东西。

谢谢!

回答1

第一个代码

FOR /D %%d IN ("D:\Folder*") DO (
    FOR /R "%%d\logs" %%i IN (*) do echo %%i
)

失败,因为您不能在for /r的文件夹中使用for可替换参数。 在for解析器的工作方式中,用作/R中的起始文件夹的值必须在for /d开始执行之前可用。

第二个代码

FOR /D %%d IN ("D:\Folder*") DO (
    SET fld=%%d
    FOR /R "%fld%\logs" %%i IN (*) do echo %%i
)

失败,因为%fld%不会像你想象的那样被解析。 for /d %%d的完整内容仅被解析为一个命令,并且该命令中的所有%var%引用都被删除,在开始执行之前被存储在变量中的值替换。 您不能更改变量的值并在同一命令中检索更改的值,因为在执行时命令中不包含任何变量扩展,只有在解析命令时变量具有的值。

这通常是通过启用延迟扩展来处理的,因此您可以在需要的地方将%var%更改为!var! 向解析器指示变量扩展(值检索)应该延迟到执行命令为止。 所以你可以写类似

setlocal enabledelayedexpansion
FOR /D %%d IN ("D:\Folder*") DO (
    SET "fld=%%d"
    FOR /R "!fld!\logs" %%i IN (*) do echo %%i
)

但是由于第一个代码中指出的相同原因,这也不起作用。 解析时需要在/R中使用的值。

那么,如何解决问题呢?

您可以通过首先将当前活动目录更改for /D %%i迭代的文件夹来避免在/R中指示文件夹

for /d %%d in ("d:\Folder*") do (
    pushd "%%~fd\logs" && (
        for /r %%i in (*) do echo %%i
        popd
    )
)

或者您可以将内部循环放在单独的子程序中

for /d %%d in ("d:\Folder*") do call :process "%%d"
goto :eof


:process folderPath
for /r "%~1\logs" %%i in (*) do echo %%i
goto :eof

或者您可以将内部递归for替换为for /f处理递归dir

for /d %%d in ("d:\Folder*") do (
    for /f "delims=" %%i in ('dir "%%~fd\logs" /a-d /b /s`) do echo %%i
)
回答2
For /D %%A In ("D:\Folder*") Do Where/R "%%~A" *

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Folder1 and Folder2 logs not showing correctly in Batch files
    This should be simple but is not working correctly. FOR /D %%d IN ("D:\Folder*") DO ( FOR /R "%%d\logs" %%i IN (*) do echo %%i ) pause I have also tried: FOR /D %%d IN ("D:\Folder*") DO ( SET fld=%%d FOR /R "%fld%\logs" %%i IN (*) do echo %%i ) pause I feel that am missing something pretty basic. Thanks!
  • 使用批处理文件将文件夹的所有内容复制到另一个文件夹?(copying all contents of folder to another folder using batch file?)
    问题 我在C:\Folder1有一个文件夹 我想将Folder1所有内容复制到另一个位置, D:\Folder2 如何使用批处理文件执行此操作? 回答1 xcopy.exe是这里的解决方案。 它内置于 Windows 中。 xcopy /s c:\Folder1 d:\Folder2 您可以在 http://www.computerhope.com/xcopyhlp.htm 找到更多选项 回答2 如果你有机器人, robocopy C:\Folder1 D:\Folder2 /COPYALL /E 否则, xcopy /e /v C:\Folder1 D:\Folder2 回答3 如果你想删除告诉你目的地是文件还是文件夹的消息,你只需添加一个斜杠: xcopy /s c:\Folder1 d:\Folder2\ 回答4 我看到很多建议使用 xcopy 的答案。 但这是不必要的。 由于问题清楚地提到作者希望在这种情况下复制文件夹中的内容而不是文件夹本身,我们可以-: copy "C:\Folder1" *.* "D:\Folder2" 如果C:\Folder1存在任何子目录,则所有xcopy都可以用于 回答5 RoboCopy 对我不起作用,这里有一些很好的解决方案,但没有人解释 XCopy 开关及其功能。 如果您的路径中有空格,您还需要引号。 xcopy /i /e "C
  • Nested If Exist statements in Batch File
    问题 好的,我正在尝试执行几个嵌套的 IF EXIST 语句来检查几个文件夹的存在。 如果第一个文件夹存在,请将 Folder1 设置为等于 1,然后跳至安装。 与 Folder2 相同,然后如果两个文件夹都不存在,则跳过安装。 但即使 Folder1 不存在,这仍然将 %Folder1% 设置为等于 1。我错过了什么/没有做什么? 谢谢! if exist "c:\folder1" set Folder1=1 echo %Folder1% goto install else if exist "c:\folder2" set Folder2=1 echo %Folder2% goto Install else goto Install :Install 回答1 两个基本问题: 复合语句必须用括号括起来。 在括号内,更改变量值将不可见,除非您执行了SETLOCAL ENABLEDELAYEDEXPANSION - 即便如此,您也需要使用 !var! 不是 %var% 所以: SETLOCAL ENABLEDELAYEDEXPANSION if exist "c:\folder1" ( set Folder1=1 echo !Folder1! goto install ) else if exist "c:\folder2" ( set Folder2=1 echo !Folder2
  • 比较两个文件夹及其子文件夹批处理文件(Comparing Two Folders and its Subfolder batch file)
    问题 我有两个包含所有相同文件和子文件夹的文件夹,但每个文件中的内容可能已更改。 我想编写一个批处理文件,它将搜索每个文件并查找任何差异。 我想做的最好的工具是什么? 回答1
  • 比较两个文件夹及其子文件夹批处理文件(Comparing Two Folders and its Subfolder batch file)
    问题 我有两个包含所有相同文件和子文件夹的文件夹,但每个文件中的内容可能已更改。 我想编写一个批处理文件,它将搜索每个文件并查找任何差异。 我想做的最好的工具是什么? 回答1
  • 批处理文件 - 为什么当文件夹 1 和 2 都存在时执行两个转到标签(batch file - why both goto labels executes when both folder1 & 2 exist)
    问题 对于下面的批处理文件,当两个或任何一个文件夹不存在时,只执行:notfound标签,这是正确的,但是当两个文件夹都存在时,则:bothfound和:notfound标签都执行。 当文件夹 Temp1 和 Temp2 都存在时,我们如何只运行:bothfound ? @ECHO OFF set "folder1=C:\Temp1\" set "folder2=C:\Temp2\" IF EXIST %folder1% IF EXIST %folder2% goto bothfound goto notfound :bothfound echo Both folders exist. :notfound echo either one or both folder not exist. echo Done. pause 回答1 与您的其他问题相同的问题。 批处理文件从上到下处理。 如果没有使用 goto 来跳过行,它将执行下一行。 这些不是您在现代编程语言中想到的方法; 新标签的开始并不意味着前一个标签的结束。 :bothfound echo Both folders exist. goto end :notfound echo either one or both folder not exist. goto end :end echo Done. pause
  • batch file - why both goto labels executes when both folder1 & 2 exist
    For below batch file, When both or any one folder NOT exist then ONLY :notfound label execute which is correct, but when both folder exist, then both :bothfound and :notfound labels execute. How we can run ONLY execute :bothfound when both folder Temp1 and Temp2 exist? @ECHO OFF set "folder1=C:\Temp1\" set "folder2=C:\Temp2\" IF EXIST %folder1% IF EXIST %folder2% goto bothfound goto notfound :bothfound echo Both folders exist. :notfound echo either one or both folder not exist. echo Done. pause
  • Batch file for copying every nth file from folder1 to folder2?
    I am trying to copy every 30th file from one folder to another and automate the process for other folders. I have already tried the batch script in this thread: windows batch file script to copy every tenth file from a folder to another folder and just get "The syntax in that command is incorrect" when I run the file (and yes, I've tried both versions). My folders do have spaces in the names (not my choice and cannot be changed). The files are named image00000X.jpg and yes, there are over 100k of them (which is why I really want the script to work). Ideally, I'd like a way to set the script up
  • 使用 xcopy 批量复制文件(batch to copy files with xcopy)
    问题 我已经在互联网上检查了一些例子,但我无法让我的(第一个)批处理文件工作。 我想自动将我的文件从一个文件夹复制到另一个文件夹,但没有任何反应。 @echo off xcopy "C:\source\" "C:\target\" /c /d /i /y exit 你能看出有什么不对吗? 谢谢!! 更新:我已经完成了巴厘岛 C 给出的命令,但它仍然不起作用。 查看快照 xcopy C:\folder1 C:\folder2\folder1 /t /e /i /y xcopy C:\folder1 C:\folder2\ /t /e /i /y 图片: 我必须用 CTRL + C 停止它。 PS:我在Win 7上 更新(解决方案):它有效! 问题是我桌面上的名称 xcopy,bat,我从那里运行命令,所以它正在执行我桌面的 xcopy.bat 文件而不是 Windows 文件。我不得不用“myxcopy.bat”重命名该文件。蝙蝠”: @echo off xcopy "C:\source" "C:\target" /c /d /i /y exit 回答1 在测试了大多数开关后,这对我有用: xcopy C:\folder1 C:\folder2\folder1 /t /e /i /y 这会将文件夹folder1复制到文件夹folder2 。 所以目录树看起来像: C: Folder1
  • 如何将批处理脚本添加到多台计算机的上下文菜单中(How to add batch script to context menu of multiple computers)
    问题 我一直在尝试设置一个可以从文件夹内的上下文菜单中运行的批处理脚本。 批处理脚本的目的是用预先确定的文件夹结构填充文件夹。 这需要在多台计算机(Windows 7-10)上复制,所以我的想法是使用两个批处理文件和一个 .reg 文件进行网络共享。 标记为“install.cmd”的批处理文件之一会将标记为“Subfolders.cmd”的另一个批处理文件复制到 C 驱动器上的文件夹,并运行 .reg 文件以在上下文菜单上安装“子文件夹”的快捷方式。 cmd”批处理文件。 我已经创建了“Subfolders.cmd”批处理文件并且它可以工作,但它必须从我想要设置文件夹结构的文件夹内部运行。我很感激有关如何创建“install.cmd”批处理脚本的任何帮助这将在 C 驱动器上创建一个文件夹,将“Subfolders.cmd”脚本复制到其中,然后运行 ​​.reg 文件以在上下文菜单中创建允许“Subfolders.cmd”批处理脚本运行的项目选定的文件夹。 我很感激任何例子和/或更有效的方法的建议。 谢谢! 更新:根据要求,我发布了在打开的文件夹中生成子文件夹的代码。 这很简单。 md "Folder1" "Folder1/Sub1A" "Folder1/Sub1B" "Folder2" "Folder2/Sub2A" "Folder2/Sub2B" 回答1 不需要所有这些复制。
  • 批处理文件来比较2个文件夹(Batch file to compare 2 folders)
    问题 我如何能够创建一个批处理文件来比较具有相同文件集但修改日期不同的 2 个文件夹? 我在互联网上检查了一些代码,但它只会检查文件是否存在于另一个文件夹中。 任何帮助,将不胜感激。 谢谢。 回答1 @echo off Set folder1=c:\first folder Set folder2=c:\second folder Cd /D "%folder1%" For %%a in (*.*) do ( For %%b in ("%folder2%\%%a") do ( If "%%~Ta" neq "%%~Tb" echo Different date/time in file %%a ) ) 您可以只比较在变量中分割%%~T...结果的日期,然后比较变量。 您还可以检查第二个文件夹中是否不存在该文件,或者比较它们的大小等... 回答2 for %%a in ("folder1" "folder2") do ( forfiles /p %%a /c "cmd /c @echo @file @fdate" ) >>dates.txt 这会将两个文件夹中的文件及其旁边的修改日期输出到名为dates.txt 的文件中,以便您进行比较。 如果您需要以其他方式比较它们,请说明。 回答3 我会尝试使用 MS Resource Kit 中的 Robocopy: ROBOCOPY
  • MySIte immediately getting logged out for 2nd request
    问题 我是 php 新手。 我面临会话问题。 我的意思是,在我登录并单击网站中的任何链接后,它会立即退出。 不知道为什么。 在 chrome 控制台中:我输入为:document.cookie,它向我显示“”,然后我明白 cookie 以某种方式立即被删除或其他问题。 以下 2 个网站存在此问题。 我们有一个像这样的网站: www.mysite.site1.com/folder1 www.mysite.site2.com/folder2 以下是我的 MySite.com/folder1 代码 function MySession() { $params = session_get_cookie_params(); session_set_cookie_params($params['lifetime'], '/v/folder1'); session_start(); } function clear() { $_SESSION=array(); session_destroy(); } 以下是我的 MySite.com/folder2 代码 function MySession() { $params = session_get_cookie_params(); session_set_cookie_params($params['lifetime'], '/v/folder2'
  • 根据可用的小于最大系统修改日期移动文件(move file based on the less than max system modified date available)
    问题 我想根据可用的小于最大系统修改日期移动 Name date Modified file1 14/05/2018 11:21 AM file2 14/05/2018 11:41 AM 在这种情况下,我们希望将 file1 与最大系统修改日期分开。 所有剩余的文件都必须移动 我试过下面的命令: move /-y "C:\app\folder1*.txt" "C:\app\folder2\" 暂停 尝试了其他步骤 Get-ChildItem -Path "C:\app\folder1\" Sort-Object LastWriteTime -Descending Move-Destination t-Object -Skip 1 Move-Item -Destination "C:\app\folder2\" | 我再次尝试出错....| C:\app\folder1>Move-Item -Destination "C:\app\folder2\" 'Move-Item' 不是内部或外部命令,也不是可运行的程序或批处理文件。 谢谢 回答1 我不知道您是否知道,但您尝试的另一步骤是powershell.exe代码而不是cmd.exe 。 与此类似的事情可能会满足您的要求: @Echo Off Set "dirSrc=C:\App\Folder1" Set "dirDst=C:\App
  • Nested If Exist statements in Batch File
    Ok, I'm trying to do a couple nested IF EXIST statements to check for the presense of a couple folders. If the first folder exists, set Folder1 to equal 1, and then skip to Install. Same with the Folder2, and then if neither folder exists just skip to install. But even when Folder1 doesn't exist, this still sets %Folder1% to equal 1. What am I missing/not doing? Thanks! if exist "c:\folder1" set Folder1=1 echo %Folder1% goto install else if exist "c:\folder2" set Folder2=1 echo %Folder2% goto Install else goto Install :Install
  • Batch file to recursively move files to first level directory from deeper subdirectories
    I have a hard drive with files and folders ordered in this similar manner: F:\folder1\folder\folder\file.rar F:\folder1\folder\folder\file1.rar F:\folder1\folder\folder\file2.rar F:\folder2\folder\file.rar F:\folder2\folder\file1.rar F:\folder3\folder\file.rar F:\folder3\folder\folder\folder\file.rar I'd like to move all files in this drive to F:\\*\ , Rename if a duplicate filename is found, and recursively delete empty folders afterwards. There's just too many of these folders to find out how deep each parent directory is. After executing the batch script the folders should look like: F
  • Call a Batch on a Share with References to Local Drives
    Environment: I have two servers, ServerA and ServerB. ServerA stores my batch scripts and manages my Task Scheduler for automation. ServerB stores several .cmd and .bat files that must be added to the Task Scheduler on ServerA. Issue: ServerB's .cmd files have local drive references as you'll see below. When called from ServerA's command line, they return errors because the command line is looking for them in ServerA instead of in ServerB. I cannot change these references because they have a considerable number of dependent pieces. Code: BatchA.bat: pushd \\ServerB\d$ call Folder1\Folder2
  • 使用对本地驱动器的引用调用共享批次(Call a Batch on a Share with References to Local Drives)
    问题 环境:我有两台服务器,ServerA和ServerB。 ServerA 存储我的批处理脚本并管理我的任务计划程序以实现自动化。 ServerB 存储多个 .cmd 和 .bat 文件,这些文件必须添加到 ServerA 上的 Task Scheduler。 问题: ServerB 的 .cmd 文件具有本地驱动器引用,如下所示。 当从 ServerA 的命令行调用时,它们返回错误,因为命令行在 ServerA 中而不是在 ServerB 中查找它们。 我无法更改这些引用,因为它们有相当多的依赖部分。 代码: BatchA.bat: pushd \\ServerB\d$ call Folder1\Folder2\Folder3\CommandB.cmd popd 命令B.cmd: call D:\Folder1\Folder2\Folder3\batch1.bat call D:\Folder1\Folder2\Folder3\batch2.bat call D:\Folder1\Folder2\Folder3\batch3.bat call D:\Folder1\Folder2\Folder3\batch4.bat 问题:如何更新 BatchA.bat 以从 ServerB 正确调用 CommandB.cmd? 回答1 您可以做的是将 ServerB 上的本地驱动器映射到
  • 批处理文件以递归方式将文件从更深的子目录移动到一级目录(Batch file to recursively move files to first level directory from deeper subdirectories)
    问题 我有一个硬盘驱动器,其中包含以类似方式排序的文件和文件夹: F:\folder1\folder\folder\file.rar F:\folder1\folder\folder\file1.rar F:\folder1\folder\folder\file2.rar F:\folder2\folder\file.rar F:\folder2\folder\file1.rar F:\folder3\folder\file.rar F:\folder3\folder\folder\folder\file.rar 我想将此驱动器中的所有文件移动到F:\\*\ ,如果找到重复的文件名,则重命名,然后递归删除空文件夹。 这些文件夹太多了,无法找出每个父目录的深度。 执行批处理脚本后,文件夹应如下所示: F:\folder1\file.rar F:\folder1\file1.rar F:\folder1\file2.rar F:\folder2\file.rar F:\folder2\file1.rar F:\folder3\file.rar F:\folder3\file (1).rar F:\\*\级别中可能存在包含文件的文件夹。 我希望他们留在原地。 回答1 尝试这个: @ECHO OFF &SETLOCAL FOR /r "F:\" %%a IN (*.rar) DO (
  • 批处理文件 - 如果两个文件夹都存在则寻找方式然后继续否则跳过操作(batch file - looking for way if both folder exist then proceed else skip the operation)
    问题 我有一个下面的批处理文件,如果 folder1 和 folder2 都存在,那么我想执行否则不想做任何事情。 在这里,甚至我的文件夹都不存在,我收到echo消息Both folders exist 。 我在这里做错了什么? @ECHO OFF set folder1="C:\Temp1" set folder2="C:\Temp2" IF EXIST %folder1% IF EXIST %folder2% goto bothfound :bothfound echo Both folders exist. goto end :end echo Done. pause 回答1 这是因为您没有 GOTO 来绕过 :bothfound 块。 在 if exists 语句之后,它会继续,因为它从未调用过 goto。 执行 if 存在后,您需要 goto 结束或 goto 到未找到的块。 例子: IF EXIST %folder1% IF EXIST %folder2% goto bothfound goto end :bothfound
  • What is meaning of \\Server1\Folder1\Folder2\File.txt in WinSCP FTP script?
    I have a put command which is working in SFTP for one file. Below, I have code using FTP and I need to convert it to SFTP: echo put \\Server1\Folder1\Folder2\File1.txt /Folder1/Folder2/sympdayedw_%datestr%%timestr%.txt >> \\Server1\Folder1\Folder2\File.txt Can anybody explain to me what the meaning of the above syntax in FTP batch script is? In my understanding File1 is copied from \\Server1\Folder1\Folder2\File1.txt to /Folder1/Folder2/sympdayedw_%datestr%%timestr%.txt, but I don't understand the meaning of \\Server1\Folder1\Folder2\File.txt. Now I need to convert from FTP to SFTP, however, I