我正在尝试遍历包含每行中路径的.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文件中的那些目录。
不确定我在哪里不正确。我做了很多关于找到可能的解决方案的研究,然而却无法找到问题的原因
答案 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执行转换。其他人,不是。
如果文件中确实有/
,那么确实需要将变量从/
传递到常规变量,因为不支持对元变量进行字符串操作,因此您可能需要
插入一行
setlocal enabledelayedexpansion
在%%A
行之后
@echo off
set "location=%%A"
set "location=!location:/=!"
pushd !location!
命令调用setlocal enabledelayedexpansion
模式,其中delayed expansion
提取变量的当前(运行时)值(而!var!
是块解析时的值)
以下%var%
在变量值中将set
更改为/
。引号确保任何尾随空格不包含在分配的值中。
请注意,\
只是禁止默认的“echo命令到屏幕”模式。 @
关闭echo-command-to-screen(并且自启动@echo off
后自身被抑制)。此后无需在批次中使用@
。