使用批处理文件

时间:2017-03-07 03:13:42

标签: windows loops batch-file

我正在尝试遍历包含每行中路径的.txt(例如.folder_list.txt)文件,如:

/subdir/folder/node-folder
/subdir/folder/node-folder-2
/subdir-2/folder4/node-folder/node-folder-1

我需要使用pushd命令连接到网络驱动器,然后逐行迭代到txt文件中的所有这些路径,然后仅列出具有特定格式的文件,如“ .html,热媒,的.pdf, .TXT”。

假设我做的时候

pushd \\mynetworkdrive\rootfolder

我的网络驱动器映射为Z:

这是我创建的批处理文件:

@echo on
cls
cd /d "Z:\"
for /F "tokens=*" %%A in (C:\Users\user1\Desktop\network\folder_list.txt) do (
set location = %%A 
cd location
@echo %location%
dir /S/Q *.htm,*.html,*.aspx,*.asp,*.php >> C:\Users\user1\Desktop\network\files_search_output.csv
)
echo "cd\"
pause

然后循环开始,它遍历网络驱动器的所有目录,而不是我的folder_list.txt文件中的那些目录。

不确定我在哪里不正确。我做了很多关于找到可能的解决方案的研究,然而却无法找到问题的原因

1 个答案:

答案 0 :(得分:2)

@echo on
cls
cd /d "Z:\"
for /F "tokens=*" %%A in (C:\Users\user1\Desktop\network\folder_list.txt) do (
pushd %%A
echo %%A
dir /S/Q *.htm,*.html,*.aspx,*.asp,*.php >> C:\Users\user1\Desktop\network\files_search_output.csv
popd
)
echo "cd\"
pause

第一个问题 - 空格在字符串=set两个方面都很重要。因此,您将值分配给“location Space

第二个问题 - 如果在代码块(括号中的命令序列)中改变普通环境变量(如delayed expansion)的值,则需要使用location - 请参阅有关此主题的无尽文章在SO。

下一步 - 由于遇到cd关键字时未定义

,因此中间location无效

接下来 - 您的for返回root只是cd ed(我离开了)

简单方法 - 当您完成该目录中的命令时,echo返回到您执行时所在的目录,不需要cd s - PUSHD所需的目录POPD

潜在问题:winbatch中路径的分隔符为PUSHD - \用作切换指示符。 SOMETIMES winbatch执行转换。其他人,不是。

如果文件中确实有/,那么确实需要将变量从/传递到常规变量,因为不支持对元变量进行字符串操作,因此您可能需要

  1. 插入一行

    setlocal enabledelayedexpansion

  2. %%A行之后

    1. 改回
    2. @echo off

      set "location=%%A" set "location=!location:/=!" pushd !location! 命令调用setlocal enabledelayedexpansion模式,其中delayed expansion提取变量的当前(运行时)值(而!var!是块解析时的值

      以下%var%在变量值中将set更改为/。引号确保任何尾随空格不包含在分配的值中。

      请注意,\只是禁止默认的“echo命令到屏幕”模式。 @关闭echo-command-to-screen(并且自启动@echo off后自身被抑制)。此后无需在批次中使用@