我想在具有特定子文件夹的文件夹中列出所有文件(具有相对路径),并将该列表写入文本文件。该文件夹是一个网络文件夹,因此我无法将其设置为当前目录。所有这一切都通过批处理脚本。
所以这样:
文件夹结构:
\\OtherComputer\MyFiles\libs
--File1.dll
--File2.dll
\\OtherComputer\MyFiles\libs\Editor\
----File3.dll
我想生成一个包含以下文本的文件:
File1.dll
File2.dll
Editor\File3.dll
这是我走了多远:
SET LibPath=\\OtherComputer\MyFiles\
break >"%LibPath%metadata"
for %%F in (%LibPath%*.*) do (
echo %%F>>"%LibPath%metadata"
)
for %%F in (%LibPath%Editor\*.*) do (
echo Editor\%%F>>"%LibPath%metadata"
)
但是这个解决方案写出了完整的路径。我试过这个删除路径:
set str=%%F:%LibPath%=%
但它似乎没有在for循环中处理变量SET
或%%F
变量。
甚至可能吗?希望不必为此编写C#可执行文件。
提前致谢!
答案 0 :(得分:1)
我有两种蝙蝠文件的方法:
code1.bat:循环播放" C:\ Mypath"
中的所有文件@echo off
FOR /F "tokens=*" %%G IN ('dir /s /b C:\Mypath\*.*') do (
CALL code2.bat %%G
)
code2.bat:删除主路径字符串
SET _var=%1
SET _endbit=%_var:*Mypath\=%
Echo %_endbit%
可能可以在一个文件中完成...看看http://ss64.com/nt/
答案 1 :(得分:1)
尝试以下方法:
@echo off
setlocal enabledelayedexpansion
set "dir=\\OtherComputer\MyFiles\"
FOR /F "tokens=*" %%f IN ('dir /s /b /A-d "%dir%"') do (
set "full=%%f"
echo !full:*%dir%=!
)
setlocal enabledelayedexpansion
,除了创建本地化环境外,还会启用变量的延迟扩展,这允许在for
循环体内修改变量,并将其与修改后的值一起使用。 (见help set
)。请注意,为了动态扩展变量,您必须将其括在!
中,而不是%
;例如,!full!
而不是%full%
。
!
个字符被解释为变量引用的一部分,从而导致可能不需要删除!
个字符。来自字符串,例如echo hi!
。要在启用延迟展开时输出文字 !
,请在未加引号字符串中使用^^!
,在中使用^!
引用字符串。此外,文字^
字符。在双引号字符串中,则必须表示为^^
。 dir /s /b /A-d "%dir%"
在当前子树(/A-d
)中列出所有文件 - 仅限文件(由于排除了/s
的目录),仅列为路径({{1} })。请注意,使用b
表示输出完整路径。
/s
设置aux。变量set "full=%%f"
到当前循环迭代中正在处理的绝对路径。
full
然后使用前缀字符串替换从绝对路径中去除输入目录。的路径,留下所需的相对路径(再次参见!full:*%dir%=!
)。
只是将其与 PowerShell (v3 +)解决方案进行对比,该解决方案演示了将PowerShell与help set
进行比较的程度。:
cmd.exe
答案 2 :(得分:1)
xcopy
命令能够返回相对路径。如果给出了/L
开关,则实际上没有复制任何内容,但会列出将在没有/L
的情况下复制的所有项目。 pushd
命令正确处理UNC路径(在命令提示符中键入pushd /?
以获取详细信息)。因此,以下代码段应该可以执行您想要的操作:
@echo off
pushd "\\host\share\folder"
> "\path\to\listfile.txt" xcopy /L /Y /C /I /E ".\*.*" "%TMP%"
popd
以上代码导致每一行都以.\
为前缀。此外,它返回一个摘要行,如# File(s)
。下面的代码摆脱了所有这些文物:
@echo off
pushd "\\host\share\folder"
> "\path\to\listfile.txt" (
for /F "tokens=2 delims=:" %%I in ('
xcopy /L /Y /C /I /E "*.*" "%TMP%"
') do (
echo(%%I
)
)
popd
在此,我将文件模式从.\*.*
更改为*.*
,从而产生Z:rel\path\to\item.ext
(而不是.\rel\path\to\item.ext
)等输出。 for /F
循环解析xcopy
的输出并删除第一个:
的所有内容,因此删除了驱动器号Z:
。由于:
是文件和目录名称的禁用字符,因此它不能出现在任何路径中。由于摘要行# File(s)
不包含任何列,因此for /F
不会对其进行枚举。