【问题标题】:PowerShell: read lines from text file, construct source and destination file names, then copy filesPowerShell:从文本文件中读取行,构造源文件名和目标文件名,然后复制文件
【发布时间】:2009-12-14 19:53:30
【问题描述】:

我是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 来复制文件,但是我在构建源代码和目标文件名。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    试试下面的

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

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

    【讨论】:

    • 优秀。非常感谢! @JaredPar,我的私人 Powershell 教练。
    • gc theFileName | %{ cp '\\server\share\$_.ext' 'C:\temp\files' } 有什么问题吗?还是会太短? :-)
    • @Johannes,我 认为 这会起作用,但我偶尔会忘记在字符串中替换的解析规则,并且不确定 .ext 是否会被正确解释。因此走了安全路线
    • Johannes,注意单引号。那些不会扩大 $_。
    【解决方案2】:

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

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

    如果您对 -WhatIf 参数感到满意,请删除它。 -l 是 -LiteralPath 的缩写,它帮助 PowerShell 确定正在使用的参数集。最好在这里使用文字路径,这样通配符就不会被覆盖(除非你想要这样 - 如果是这样,那么使用 -path)。

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

    【讨论】:

    • 这是真的还是 Copy-Item 的一个绝妙功能?
    • 这适用于任何也受管道约束的参数。 PowerShell 参数解析器/绑定器将为管道绑定参数评估脚本块,当然,除非参数类型是 [scriptblock]。
    • 确实,它甚至适用于 ValueFromPipelineByPropertyName 参数——太棒了!
    • 不,没关系,没有我想象的那么酷。您的语法不会转换附加到管道对象的属性——它会覆盖它。对于一次性的情况仍然很方便,但总的来说用处不大。
    猜你喜欢
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2012-06-15
    • 1970-01-01
    • 2011-09-17
    相关资源
    最近更新 更多