【发布时间】:2019-03-21 10:38:58
【问题描述】:
我有以下 powershell 代码,它试图重命名文件夹中的所有 SQL 文件,为每个文件添加一个唯一的前缀,例如第一个前缀是 '1001 - sp - C - ':
gci -Path 'C:\FolderToLookIn' -Exclude "1*" | ForEach-Object {
New-Object PSObject -Property @{
'LineNumber' = $linenumber;
'Name' = $_.Name;
'Extension' = $_.Extension
};
$linenumber++
} | Where-Object {
$_.Extension -eq ".sql"
} | Rename-Item -NewName {$_.LineNumber.ToString("1000") + ' - sp - C - ' + $_.Name}
但是,这会产生如下错误:
重命名项目:无法重命名,因为项目位于 '@{Extension=.sql;行号=22; Name=sp_Firm_GetAll.sql}' 不存在。
那么,如何添加LineNumber 属性并将其用作Rename-Item 命令中的前缀而不丢失项目本身?
编辑
我还尝试了以下方法,通过FullName 并在Rename-Item 中使用它:
gci -Path 'C:\FolderToSearch' -Exclude "1*" | ForEach-Object {
New-Object psObject -Property @{
'LineNumber' = $linenumber;
'Name' = $_.Name;
'Extension' = $_.Extension;
'FullName' = $_.FullName
};
$linenumber++
} | Where-Object {
$_.Extension -eq ".sql"
} | Rename-Item -Path $_.FullName -NewName {$_.LineNumber.ToString("1000") + ' - sp - C - ' + $_.Name}
但是,这个错误也有:
重命名项目:无法将参数绑定到参数“路径”,因为它为空。 在行:3 字符:19 + 重命名项目 - 路径 $_.FullName -NewName {$_.LineNumber.ToString("1000") + ' - sp【问题讨论】:
-
Rename-Item没有FullName参数 - 在你的最后一个例子中,更改'FullName'= $_.FullName->'LiteralPath'= $_.FullName代替 -
@MathiasR.Jessen 谢谢,我尝试将新对象中的属性名称从 FullName 更改为 LiteralPath 并在
rename-item部分中将$_.FullName更新为$_.LiteralPath,但这仍然返回错误“重命名项目:无法将参数绑定到参数“路径”,因为它为空。” -
没有。当您从管道读取输入时,完全从该语句中删除
-Path参数及其参数。 -
为什么不首先将 gci 限制为
*.sql文件而不是使用Where-Object?当您排除1*时,在连续运行时会生成相同的前缀1000 - sp - C -(因为旧名称是唯一的) -
@AnsgarWiechers 抱歉,我还没到呢!我现在在没有路径的情况下尝试了这个,因为它在我第一次尝试时没有路径,但是按照 Mathias 的建议将 FullName 更改为 LiteralPath,但返回的错误类似于我收到的第一个错误。如果有人有一个工作示例,他们可以发布作为对此的答案,将不胜感激。谢谢