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

AJ.*_*AJ. 4 powershell

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

12345678
98765432
32145698
12365782
Run Code Online (Sandbox Code Playgroud)

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

\\server\share
Run Code Online (Sandbox Code Playgroud)

我的目标文件夹是:

c:\temp\files
Run Code Online (Sandbox Code Playgroud)

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

copy \\server\share\$_.ext c:\temp\files\$_.ext
Run Code Online (Sandbox Code Playgroud)

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

Jar*_*Par 5

请尝试以下方法

gc theFileName | 
  %{ "{0}.ext" -f $_ } |
  %{ copy "\\server\share\$_" "c:\temp\files\$_" }
Run Code Online (Sandbox Code Playgroud)

它实际上可以在一行上完成,但它看起来更好,作为这个答案的多行格式化:)

  • 约翰内斯,小心单引号.那些不会扩大$ _. (3认同)

Kei*_*ill 5

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

gc theFileName | cpi -l {"\\server\share\$_.exe"} c:\temp\files -whatif
Run Code Online (Sandbox Code Playgroud)

-WhatIf满意后,请删除该参数。-l是-LiteralPath的缩写,它可以帮助PowerShell确定正在使用的参数集。另外,最好在此处使用原义路径,以免通配符不引起混乱(除非您希望如此,否则请使用-path)。

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