我正在尝试使用powershell命令根据文件中的前10个字符重命名文件夹。
我已经尽可能地提取了我需要用来重命名的数据,但是我不知道如何传递它。
Get-Content 'C:\DATA\Company.dat' |
Select-Object -first 10 |
rename 'C:\DATA\FOLDER' 'C:\DATA\FOLDER (first 10)'
我停留在的部分是(first 10)
,我不知道该通过什么来完成任务?
答案 0 :(得分: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所述,没有选择对象
Rename-Item -Path 'C:\DATA\FOLDER' -NewName "C:\DATA\$((Get-Content 'C:\DATA\Company.dat' -raw).Substring(0,10))"
答案 1 :(得分:0)
用第三种方法补充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))"
注意:
仅将新的名称传递给Rename-Item
的第二个位置参数(-NewName
参数)就足够了;例如FOLDER 1234567890
,而不是整个路径。尽管可以传递整个路径,但它必须指向与输入路径相同的位置。
substring-extraction命令通过"..."
和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]
请注意如何通过{ ... }
引用输入对象(在这种情况下为10个字符的字符串)的delay-bind script-block argument($_
)确定新名称。 ;正是这种技术使重命名命令可以在多个输入上进行操作,其中每个新名称都来自手头的特定输入。