PowerShell:从文本文件中读取行,构造源文件名和目标文件名,然后复制文件

时间:2009-12-14 19:53:30

标签: powershell

我是PowerShell新手,我希望能够编写此脚本。我有一个文本文件,其中每一行都是文件名的一部分,没有路径或扩展名。我想要一个循环遍历文件每一行的单行(带有gc - Get-Content,对吧?),获取行的内容,构造源路径(网络驱动器和扩展是静态的) ),构造目标路径,然后复制每个文件。我的文件内容是这样的:

12345678
98765432
32145698
12365782

我的源文件夹是这样的UNC路径:

\\server\share

我的目标文件夹是:

c:\temp\files

我想使用$_作为文件每一行的文本,相当于这个DOS命令:

copy \\server\share\$_.ext c:\temp\files\$_.ext

我很确定我可以使用gc$_来访问文件的每一行,并且我需要使用cp来复制文件,但我是在构造源文件名和目标文件名时遇到问题。

2 个答案:

答案 0 :(得分:5)

尝试以下

gc theFileName | 
  %{ "{0}.ext" -f $_ } |
  %{ copy "\\server\share\$_" "c:\temp\files\$_" }

它实际上可以在一行上完成,但它看起来更好地形成了这个答案的多行:)

答案 1 :(得分:4)

在这种情况下,Copy-Item可以直接使用脚本块,因此不需要Foreach-Object阶段:

gc theFileName | cpi -l {"\\server\share\$_.exe"} c:\temp\files -whatif

一旦您满意它就可以删除-WhatIf参数。 -l是-LiteralPath的缩写,可帮助PowerShell确定正在使用哪些parameterset。最好在这里使用文字路径,以便通配符不会被全局化(除非你想要 - 如果是这样,那么使用-path)。

基本上可以通过scriptblocks指定管道绑定参数,PowerShell将尝试将scriptblock的结果解析为管道绑定参数所期望的类型。