使用get-content重命名文件夹?

问题描述 投票:1回答:2

我正在尝试使用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
2个回答
3
投票

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,没有Select-Object

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

0
投票

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

如果已知感兴趣的字符全部在第1行(在您的情况下这是一个安全的假设),您可以使用Get-Content -First 1 ...(与:Get-Content -TotalCount 1 ...相同)直接(并且排他地)检索第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))"

注意:

  • 仅将新名称传递给Rename-Item的第二个位置参数(-NewName参数)就足够了;例如,FOLDER 1234567890,而不是整条道路。虽然您可以传递整个路径,但它必须引用与输入路径相同的位置。
  • 子串提取命令通过expandable string "..."嵌入到$(...)subexpression operator)中。

至于你试过的:

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]一样
  • 注意新名称是如何通过q​​azxswpoi(delay-bind script-block argument)确定的,其中{ ... }指的是输入对象(在这种情况下是10个字符的字符串);正是这种技术使重命名命令能够在多个输入上运行,其中每个新名称都是从手头的特定输入派生的。
© www.soinside.com 2019 - 2024. All rights reserved.