将文本添加到输入中,仅将第二部分添加到最后一行

时间:2016-10-25 13:45:19

标签: powershell foreach

我编写了一个小脚本,通过根据输入文件生成完整的命令,帮助我更有效地将文件夹从一个地方移动到另一个地方。

代码:

Get-Content inputfile.txt |
    ForEach-Object {
        "robocopy D:\Home\" + $_ + " H:\Home-E\" + $_
    } | Set-Content outputfile.txt

现在这个工作正常,除了最后一部分只被添加到最后一行。

输出文件如下所示:

robocopy D:\Home\ewja 
robocopy D:\Home\ewst
robocopy D:\Home\ewwi
robocopy D:\Home\ezga H:\Home-E\ezga

有人知道为什么第二部分会从第一行中被切断吗?

2 个答案:

答案 0 :(得分:0)

在输入文件中的每一行之后输出空格搞砸了所有内容。删除了空格,一切按预期工作。

答案 1 :(得分:0)

您的问题纯属视觉问题:

输入文件的每一行之后的尾随空格非常长 - 每行但最后一行是右空格填充到119个字符 - $_的第二个引用扩展为(以H:\Home-E\...开头的部分)仅仅滚出视图
只有 last 空格填充,因此对于最后一个命令,整个输出行在控制台中可见。

请注意,结果命令仍然会工作 ,因为传递给命令的参数之间的空白量并不重要。

要在源处解决问题:

Get-Content inputfile.txt |
    ForEach-Object {
        $_ = $_ -replace '\s+$' # trim trailing whitespace from input line
        "robocopy D:\Home\" + $_ + " H:\Home-E\" + $_
    } | Set-Content outputfile.txt

请注意,双引号字符串中的字符串插值可以使命令字符串的构造更简单"robocopy D:\Home\$_ H:\Home-E\$_"

但是,这两种方法通常都不是很强大,因为它可以打破带有嵌入空格的文件名的构造robocopy命令,因此您必须执行引用/转义输入文件名。
具体方法取决于shell将最终执行包含构造命令的文件。