Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 从目录列表(文本文件)复制具有特定扩展名的文件_Powershell_Cygwin_Cmd_Xcopy_Shell_Bash - Fatal编程技术网

Powershell 从目录列表(文本文件)复制具有特定扩展名的文件

Powershell 从目录列表(文本文件)复制具有特定扩展名的文件,powershell,cygwin,cmd,xcopy,shell,bash,Powershell,Cygwin,Cmd,Xcopy,Shell,Bash,我有一个包含特定目录列表的文本文件,我想将*.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:\_M__\files" for /f "tokens=*" %%i in (list.txt)

我有一个包含特定目录列表的文本文件,我想将*.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:\_M__\files"
for /f "tokens=*" %%i in (list.txt) DO (
    xcopy "%main_folder%\%%i" "%my_folder%"
)
因此,我要查看的文件夹是\\internal.company.com\project folder\PT_NAK01等

我不知道的是如何将特定的扩展名*.xlsx传递给这个命令

注意:我没有故意在xcopy中使用/S开关,因为我不希望子目录中的文件

p.S.解决方案也适用于我。

这是一个高级的解决方案,应在标准Posix shell/bin/sh不足时保留。请注意,斜杠是有意颠倒的

我看到your list.txt中的格式用逗号和空格分隔。我将假设这是字面意义上的,而你迄今为止所尝试的方法都不起作用。因此,我解析它时明确假设逗号和空格是一个分隔符,并且无法逃避它们。例如,如果您有一个名为apples,oranges.txt的文件,那么我的代码将错误地解析名为apples和oranges.txt的文件

!/垃圾箱/垃圾箱 main_folder=${1:-//internal.company.com/project folder} my_folder=${2:-c://\u Masoud/files} cd$main|u文件夹|退出$? IFS=','find$cat list.txt-maxdepth 1-name\*.xlsx |而IFS=read xlsx;做 mkdir-p$my_folder/${xlsx%/*} cp-一个$xlsx$my_文件夹/$xlsx 完成 我为你做了一些额外的工作,使它更抽象$main_文件夹取自第一个参数缺少的参数将默认为//internal.company.com/project folder,$my_文件夹取自第二个参数如果缺少,则默认为c://\u Masoud/files。如果命令行参数包含空格或可解释字符,请不要忘记引用它们

在确定了源和目标之后,我尝试将目录更改为源目录。如果失败,脚本将使用相同的退出代码停止


现在开始循环。我已经将输入字段分隔符$IFS更改为逗号和空格,我们前面已经讨论过,然后将list.txt的内容粘到它的参数中,然后要求包含PT_NAK05/foobar/baz.xlsx,使用-maxdepth 2或干脆删除该子句以递归方式查看文件树,然后是名称匹配*.xlsx的要求,这是转义的,因为您的shell会假定您正在谈论本地目录。然后将其输出作为$xlsx逐行读取到循环中。我们在新目标目标中重新创建目标的父目录(如果它还不存在),然后将文件复制到该位置。cp-a保留权限和时间戳。

在我的示例中出现错误的一件事是如何使用文件夹名称设置文本文件。应将回车设置为分隔符,而不是逗号分隔的条目

等等

有鉴于此,本批文件以参考作品为目的提出了问题

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

注意:如果要直接在命令行中键入,变量不需要双精度%。

您尝试过吗?xcopy%main\u folder%\%%i\*.xlsx%my\u folder%可能尝试xcopy%main\u folder%\%%i\*.xlsx%my\u folder%。现在,*.xlsx没有被引用,应该扩展,但我不再使用它来确定;-。祝你好运。@Masoud它应该是这样工作的。但问题出在for循环和逗号分隔列表中。打开echo,您将在cmd上看到输出。它将整个列表作为一个文件夹。@现在你是对的。我把名字和回车分开,Sheller的评论对我很有用。谢谢无论如何,如果你发布一个答案,我会接受它,这个线程将被标记为已回答。是的,它比它应该的更复杂,但我想重新创建你的逻辑,在项目上循环,然后复制每个项目。在测试中,我也无法让rsync正常工作;理论上,像rsync-a-include'*.xlsx'-exclude'*'$main\u folder$my\u folder/这样的东西应该可以做到这一点,但我有些地方弄错了。
@echo off
set main_folder="\\internal.company.com\project folder\"
set my_folder="C:\_M__\files"
for /f "tokens=*" %%i in (list.txt) DO (
    xcopy "%main_folder%\%%i\*.xlsx" "%my_folder%"
)