我是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
来复制文件,但我是在构造源文件名和目标文件名时遇到问题。
答案 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的结果解析为管道绑定参数所期望的类型。