我正在尝试使用powershell命令基于文件中的前10个字符重命名文件夹。
我甚至拉动了我需要用来重命名的数据,但我不知道如何传递它。
Get-Content 'C:\DATA\Company.dat' |
Select-Object -first 10 |
rename 'C:\DATA\FOLDER' 'C:\DATA\FOLDER (first 10)'
我坚持的部分是(first 10)
,我不知道该通过哪一部分来完成我的任务?
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))"
用第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
,而不是整条道路。虽然您可以传递整个路径,但它必须引用与输入路径相同的位置。"..."
嵌入到$(...)
(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个字符的字符串);正是这种技术使重命名命令能够在多个输入上运行,其中每个新名称都是从手头的特定输入派生的。