【问题标题】:Piping in windows PowerShellWindows PowerShell 中的管道
【发布时间】:2018-06-07 00:47:19
【问题描述】:

我有两个文件:

文件1:

目录1 目录2 目录3

文件2:

f1 f2 f3

File1 包含目录列表,File2 包含文件列表。我想使用 PowerShell 将当前目录中的 File2 中的所有文件复制到 File1 中提到的目录中。为了做同样的事情,我使用以下命令:

Get-Content File2  | ForEach-Object {
    $dir = $_ ;
    Get-Content File1 |
        Copy-Item ("c:\users\")+$_ (("c:\users\")+$dir+("/")+($_))) 

但是,我在这方面遇到了错误。有人可以帮我形成正确的查询

我得到的错误是:

输入对象不能绑定到命令的任何参数,因为命令不接受管道输入,或者输入及其属性不匹配接受管道输入的任何参数。

我希望将 f1、f2、f3 复制到 dir1。再次将 f1、f2、f3 复制到 dir2。再次将 f1、f2、f3 复制到 dir3。

【问题讨论】:

  • 能否提供您遇到的错误。
  • 您是否希望将文件f1 复制到目录dir1,将文件f2 复制到目录dir2 等等......?
  • @VivekKumarSingh 我希望将所有 f1、f2、f3 复制到 dir1。再次将 f1,f2,f3 复制到 dir2,类似
  • @GeorgeGrainger 完成
  • File1 包含目录列表,File2 包含文件列表。 是列表还是 File1 实际上包含 dir1、dir2 和 dir3? File2 同样的问题。

标签: powershell powershell-3.0


【解决方案1】:

Copy-Item 只有一个参数接受源路径作为管道输入:-Path(或-LiteralPath,取决于使用的参数集)。但是,您已经将源路径作为第一个位置参数传递给-Path,因此没有剩余的参数可以接受管道输入。您不能“叠加”位置参数和管道输入。它是一个或另一个。此外,Copy-Item 语句中的 $_ 不是您所期望的。它实际上是来自ForEach-Object 的当前对象,而不是来自Get-Content 输出的当前对象。您需要将Get-Content 传送到另一个ForEach-Object 并将Copy-Item 放入该循环中,以使其按您期望的方式工作。正如 cmets 中的 Jeff Zeitlin pointed out,您的目录名称实际上来自 File1,因此您需要为外循环读取该文件,并为内循环读取 File2(带有文件名)。

Get-Content File1 | ForEach-Object {
    $dir = $_
    Get-Content File2 | ForEach-Object {
        Copy-Item "C:\users\${_}" "C:\users\${dir}\${_}"
    }
}

但是,这在您的场景中不是必需的,因为您可以简单地在 Get-Content File1 的输出前面加上路径前缀并将其用作 Copy-Item 的输入:

Get-Content File1 | ForEach-Object {
    $dir = $_
    (Get-Content File2) -replace '^', 'C:\users\' |
        Copy-Item -Destination {'C:\users\{0}\{1}' -f $dir, (Split-Path -Leaf $_)}
}

请注意,您需要在参数 -Destination 的参数周围加上大括号才能使其正常工作。

旁注:尽可能避免字符串连接。 PowerShell 可以扩展双引号字符串内的变量,大大提高了可读性。

【讨论】:

  • 如果我正确阅读了这个问题(并且我希望有人在我想纠正你的答案之前对其进行验证),在我看来你已经交换了 File1 和 @ 987654339@.
  • @JeffZeitlin 怎么样?我确实从问题中提取了代码并调整了各个命令,使整体代码结构保持原样。
  • File1 是目录,File2 是文件。您将文件分配给$dir。桌面检查您的代码,并与问题的散文进行交叉检查,不一定只是代码。
  • @JeffZeitlin 啊,你是对的。该代码确实切换了文件。感谢您的提醒。固定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-15
相关资源
最近更新 更多