批次:从目录

问题描述:

列表复制某些文件我有,我想从他们*.xlsx文件复制到另一个目录某些目录的列表的文本文件。批次:从目录

这是怎样的文本文件(list.txt)设置:

PT_NAK01, PT_NAK04, PT_NAK05, PT_JAR03 

我想用这样的利用复制的文件类似如下:

@echo off 
set main_folder="\\internal.company.com\project folder\" 
set my_folder="C:\_Masoud\files" 
for /f "tokens=*" %%i in (list.txt) DO (
    xcopy "%main_folder%\%%i" "%my_folder%" 
) 

所以我想查看的文件夹将是\\internal.company.com\project folder\PT_NAK01

我不知道的是如何通过特定扩展名*.xlsx到这个命令。

注:我没有用/S交换机xcopy故意,因为我不想在子目录中的文件。

附:的解决方案也适用于我。

+0

你试过这个吗? 'xcopy“%main_folder%\ %% i \ *。xlsx”“%my_folder%”' – MatSnow

+0

@MatSnow它找不到文件并且什么也不复制。我不认为你可以将通配符作为文本传递。不是cmd tho的专家。 – Masoud

+1

也许试试'xcopy“%main_folder%\ %% i \”*。xlsx“%my_folder%”'。现在'* .xlsx'没有被引用,并且应该扩展(但是我不再使用这个足以确定;-))。祝你好运。 – shellter

这是一个答案(是一种先进的应该用于当标准的Posix壳(/bin/sh)不足以被保留)。请注意,斜杠是有意颠倒的。

我看到你的list.txt格式被分隔用逗号和空格。我会假设这是字面的,而且迄今为止你所尝试过的任何一个原因都不适用。因此,我与明确的假设分析它是逗号,然后空间()是一个分隔符,没有办法逃避他们(例如,如果你有一个名为apples, oranges.txt文件,然后我的代码会错误解析命名​​和oranges.txt文件)。

#!/bin/sh 
main_folder="${1:-//internal.company.com/project folder}" 
my_folder="${2:-c:/_Masoud/files}" 
cd "$main_folder" || exit $? 
IFS=', ' find $(cat list.txt) -maxdepth 1 -name \*.xlsx |while IFS= read xlsx; do 
    mkdir -p "$my_folder/${xlsx%/*}" 
    cp -a "$xlsx" "$my_folder/$xlsx" 
done 

我已经做了一些额外的工作,为您作出这个更抽象。 $main_folder从你的第一个参数取(缺少参数将默认为//internal.company.com/project folder)和$my_folder从你的第二个参数取(如果缺失,则默认为c:/_Masoud/files)。不要忘记引用你的命令行参数,如果它们包含空格或可解释的字符。

确定您的源和目标后,然后尝试将目录更改为源目录。如果失败,脚本将以相同的退出码停止。

现在为循环。我已经改变了输入分隔符($IFS)是逗号和空格(),我们前面谈到的,然后胶合list.txt内容到它的参数,其次是一个深层次的需求(包括PT_NAK05/foobar/baz.xlsx,使用-maxdepth 2或者只是完全删除该子句以递归查看文件树),然后是匹配*.xlsx的名称的要求(因为您的shell会假设您正在谈论本地目录,所以这会被转义)。然后将这个输出作为$xlsx逐行读入循环。如果目标的目标目标不存在,我们将重新创建目标的父目录,然后将文件复制到该目标位置。 cp -a保留权限和时间戳。

+1

是的,它比它应该更复杂,但我想重新创建循环播放项目然后复制每个项目的逻辑。我也无法让rsync在我的测试中正常工作;理论上,像'rsync -a --include'* .xlsx'--exclude'*'“$ main_folder”“$ my_folder /”'应该可以做到这一点,但是我有一些错误。 –

在我的示例中发生错误的一件事是我如何使用文件夹名称设置文本文件。应使用回车符作为分隔符而不是comma-separated条目。

PT_NAK01 
PT_NAK04 
PT_NAK05 

说完,这个批处理文件(参考MatSnow's and shellter's comments)对这个问题的目的,工作正常。

@echo off 
set main_folder="\\internal.company.com\project folder\" 
set my_folder="C:\_Masoud\files" 
for /f "tokens=*" %%i in (list.txt) DO (
    xcopy "%main_folder%\%%i\*.xlsx" "%my_folder%" 
) 

注:如果你想这种类型直接进入命令行模式,你不需要双%的变量。