通过批处理脚本将具有相对路径的文件列表写入文件

时间:2015-12-19 13:09:48

标签: batch-file

我想在具有特定子文件夹的文件夹中列出所有文件(具有相对路径),并将该列表写入文本文件。该文件夹是一个网络文件夹,因此我无法将其设置为当前目录。所有这一切都通过批处理脚本。

所以这样:

文件夹结构:

\\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#可执行文件。

提前致谢!

3 个答案:

答案 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%=!)。

    < / LI>

只是将其与 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不会对其进行枚举。