【问题标题】:Using get-content to rename a folder?使用 get-content 重命名文件夹?
【发布时间】:2019-09-08 19:29:21
【问题描述】:

我正在尝试使用 powershell 命令根据文件中的前 10 个字符重命名文件夹。

我已经提取了我需要用来重命名的数据,但我不知道如何传递它。

Get-Content 'C:\DATA\Company.dat' |
    Select-Object -first 10 |
    rename 'C:\DATA\FOLDER' 'C:\DATA\FOLDER (first 10)'

我坚持的部分是(first 10),我不知道该传递什么来完成我的任务?

【问题讨论】:

    标签: powershell substring rename


    【解决方案1】:

    Select-Object -first 10 将获取前 10 个对象。在您的情况下,这将是文件的前 10 行,而不是 10 个字符。

    你可以使用这样的东西

    Rename-Item -Path 'C:\DATA\FOLDER' -NewName "C:\DATA\$((Get-Content 'C:\DATA\Company.dat' | Select-Object -first 1).Substring(0,10))"
    

    使用-first 1 获取第一行,使用.Substring(0,10) 获取前10 个字符。

    编辑: 或者正如@AdminOfThings 提到的,没有选择对象

    Rename-Item -Path 'C:\DATA\FOLDER' -NewName "C:\DATA\$((Get-Content 'C:\DATA\Company.dat' -raw).Substring(0,10))"
    

    【讨论】:

    • 如果你想避免管道到Select,你可以使用-Raw开关Get-Content
    • 这对我需要做的事情有效。非常感谢。
    • @astanix:请允许我给新人的标准建议:如果答案解决了您的问题,请单击旁边的大复选标记 (✓) 接受它,也可选择投票它(投票至少需要 15 个声望点)。如果您发现其他答案有帮助,请给他们投票。接受(您将获得 2 个声望点)和投票可以帮助未来的读者。请参阅this FAQ 了解更多信息。
    【解决方案2】:

    用第三种方法补充Michael B.'s helpful answer

    如果已知感兴趣的字符都在第一行(在您的情况下这是一个安全的假设),您可以使用Get-Content -First 1 ...(与:Get-Content -TotalCount 1 ...)直接检索第一行(并且独家),其中:

    • 性能优于Get-Content ... | Select-Object -First 1

    • 避免使用Get-Content -Raw ...将整个文件读入内存

     Rename-Item 'C:\DATA\FOLDER' `
                 "FOLDER $((Get-Content -First 1 C:\DATA\Company.dat).Substring(0, 10))"
    

    注意:

    • 只需将新的 name 传递给Rename-Item 的第二个位置参数(-NewName 参数)即可;例如,FOLDER 1234567890,而不是整个路径。虽然您可以传递整个路径,但它必须引用与输入路径相同的位置。

    • 子字符串提取命令通过$(...)subexpression operator 嵌入在expandable string ("...") 中。


    至于你尝试了什么

    Select-Object -First 10 获取前 10 个输入对象,它们是Get-Content 输出的文件的;换句话说:您将通过管道发送 10 个 而不是 10 个 字符,即使它们 个字符,它们也会是一个接一个地发送

    虽然可以在管道中解决这个问题,但它会很麻烦而且很慢:

    -join ( # -join, given an array of chars., returns a string
      Get-Content -First 1 C:\DATA\Company.dat | # get 1st line
        ForEach-Object ToCharArray |  # convert to a char. array
          Select-Object -First 10 # get first 10 chars.
    ) | 
      Rename-Item 'C:\DATA\FOLDER' { 'FOLDER ' + $_ }
    

    也就是说,您可以将上述内容转换为更快、更简洁的内容:

    -join (Get-Content -First 1 C:\DATA\Company.dat)[0..9] |
      Rename-Item 'C:\DATA\FOLDER' { 'FOLDER ' + $_ }
    

    注意:

    • Get-Content -First 1(最多)返回 1 行,在这种情况下,PowerShell 按原样返回该行,而不是包装在数组中。

    • 使用范围运算符 (..') 对字符串 ([...]) 进行索引 - 例如,[0..9] - 将指定位置的字符隐式提取为数组;就好像你打电话给.ToCharArray()[0..9]

    • 注意新名称是如何通过delay-bind script-block argument ({ ... }) 确定的,其中$_ 指的是输入对象(在这种情况下是10 个字符的字符串);正是这种技术使重命名命令能够对多个输入进行操作,其中每个新名称都来自手头的特定输入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      • 2014-09-09
      • 2015-05-27
      • 1970-01-01
      • 2017-12-12
      • 1970-01-01
      • 2011-02-08
      相关资源
      最近更新 更多