【问题标题】:Is there a single PowerShell command to copy and rename files?是否有一个 PowerShell 命令来复制和重命名文件?
【发布时间】:2013-01-21 03:17:55
【问题描述】:

我正在使用以下命令将文件从网络共享复制到基于 CSV 文件的本地硬盘。

import-csv C:\TEST\test.csv | foreach {copy-item -path $_.npath -destination 'C:\TEST\'}

下一步是使用不同的 CSV 文件根据当前文件名重命名这些文件。

是否有一个命令可以让我复制和项目并重命名它?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    如果您的 CSV 包含两列,oldfilepath 和 newfilename,那么您可以使用以下内容。

    Import-Csv C:\test.csv | % { Copy-Item -Path $_.oldfilepath -Destination "C:\TEST\$($_.newfilename)" }
    

    注意$_.newfilename 是如何封装在$() 中的。那是因为$_.newfilename 是一个表达式(因为我们从变量中获取了一个属性),而不是一个变量。 $() 告诉 PowerShell 在字符串中使用表达式之前先对其进行求解。如果我们不使用它,它将使用该行的整个 csv 对象 ($_) 作为字符串并返回错误。

    【讨论】:

    • 工作就像一个魅力。谢谢格雷默!我仍然不明白为什么 Taz 在下面的答案不起作用,而这个答案却起作用。
    【解决方案2】:

    如果您的原始 CSV 文件中也包含新名称,您可以使用它在复制路径的末尾指定一个文件名。复制项 CMDlet 允许您指定目标文件名

    Copy-Item C:\TEST\file1.jpg C:\TEST\file2.jpg
    

    将复制file1.jpg并将其重命名为file2.jpg

    要将变量连接到路径字符串的末尾,您可以使用这样的双引号:

    Copy-Item C:\Path\To\File\file.ext "C:\Path\To\New\File\$newfilename"
    

    请注意,-path 和 -destination 并不是真正必需的,因为它们是由位置暗示的。

    【讨论】:

    • 所以,如果我的 CSV 中有一个名为“NewName”的加工列,那么只需将目标字符串修改为“-destination 'C:\TEST\' + $_.newname” ?我明天会测试这个,但我有一种感觉,我已经尝试过了,但没有成功,希望它类似于 Linux mv 命令。
    • 您需要执行 Copy-Item C:\Path\To\File "C:\Path\To\New\File\$newfilename" 以使变量在字符串中正确展开。也就是说 - 用引号将整个内容封装起来。对不起,我会更好地更新答案。
    • 这就是我对PS的不理解。为什么我输入的内容不起作用?为什么将变量称为 $_。在一种情况下,但 $ 在另一种情况下和引号内?这似乎是一种草率的实现,这让这种语言学习起来很沮丧。
    • 我的回答更多是关于 powershell 字符串变量连接的功能和性质,而不是在您不做任何工作的情况下为您提供答案。在我的示例中,我有一个变量,我正在连接一个名为 $newfilename 的变量,但显然你会用你的管道列值替换它。 $_。语法用于获取管道对象的属性,而简单的 $ 只是表示一个变量,我相信你知道。很抱歉因为不准确而让您失望,但是如果您不获取函数参考并自己应用它,那么成就在哪里!
    猜你喜欢
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2012-12-28
    • 2013-06-13
    • 1970-01-01
    相关资源
    最近更新 更多