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

PowerShell:从文本文件中读取行,构造源文件名和目标文件名,然后复制文件,powershell,Powershell,我是一个新手,我希望能够编写这个脚本。我有一个文本文件,其中每一行都是文件名的一部分,没有路径或扩展名。我想要一个单行程序,它循环文件的每一行(使用gc-,对吗?),获取该行的内容,构造源路径(网络驱动器和扩展是静态的),构造目标路径,然后复制每个文件。我的文件内容如下: 12345678 98765432 32145698 12365782 \\server\share 我的源文件夹的路径如下所示: 12345678 98765432 32145698 12365782 \\server

我是一个新手,我希望能够编写这个脚本。我有一个文本文件,其中每一行都是文件名的一部分,没有路径或扩展名。我想要一个单行程序,它循环文件的每一行(使用gc-,对吗?),获取该行的内容,构造源路径(网络驱动器和扩展是静态的),构造目标路径,然后复制每个文件。我的文件内容如下:

12345678
98765432
32145698
12365782
\\server\share
我的源文件夹的路径如下所示:

12345678
98765432
32145698
12365782
\\server\share
我的目标文件夹是:

c:\temp\files
我想执行与此DOS命令等效的操作,使用
$\uu
作为文件每行的文本:

copy \\server\share\$_.ext c:\temp\files\$_.ext
我很确定我可以使用
gc
$\ucode>来访问文件的每一行,并且我需要使用
cp
来复制文件,但是我在构建源文件名和目标文件名时遇到了问题。

尝试以下方法

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

实际上,它可以在一行上完成,但对于这个答案,它看起来更适合用多行格式:)

复制项可以直接获取脚本块,因此在这种情况下,Foreach对象阶段是不必要的:

gc theFileName | cpi -l {"\\server\share\$_.exe"} c:\temp\files -whatif
一旦您确信
-WhatIf
参数有效,请将其删除。-l是-LiteralPath的缩写,它可以帮助PowerShell确定正在使用的参数集。在这里最好使用文本路径,这样通配符就不会被全局化(除非您需要这样做,否则使用-path)


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

非常好。非常感谢@JaredPar,我的个人Powershell教练。
gc theFileName |%{cp'\\server\share\$\ ext''C:\temp\files'}
有什么问题吗?还是会太短?:-)@Johannes,我认为这会起作用,但我偶尔会忘记字符串内替换的解析规则,并且不确定.ext是否会被正确解释。于是就走上了安全的道路——约翰,小心那些单引号。这些将不会扩展$。这通常是真的还是复制项的一个漂亮特性?这适用于任何管道绑定的参数。PowerShell参数解析器/绑定器将为管道绑定参数计算脚本块,当然,除非参数类型为[scriptblock]。事实上,它甚至可以在ValueFromPipelineByPropertyName参数上工作——棒极了!不,没关系,没有我想象的那么酷。您的语法不会转换附加到管道对象的属性——它会覆盖它。对于一次性案例仍然很方便,但一般来说用处要小得多。