PowerShell中的管道如何传递字符串?

3
我尝试使用下面的PowerShell脚本重命名一些文件。
 powershell.exe "& { Get-ChildItem *.txt | Rename-Item -NewName { $_.name -Replace '.txt','.csv' } }"

但是当执行"& command"时,$_.name似乎已经被解析,因此它会抱怨不认识.name$_已被删除)。在不使用外部字符串的情况下执行可以解决问题,但由于其他原因,在我的情况下不可行。

如何转义$_.name


你是在 PowerShell 中运行吗?如果是,你不需要 powershell "& {...}" 包装器。直接运行命令即可。否则 $_ 不应该被扩展。 - Ansgar Wiechers
尝试在外部字符串使用单引号,内部使用双引号? - Mark Wragg
2
你是如何运行这个命令的?使用PSv5时,当我从CMD中执行它时,它按预期工作... - henrycarteruk
我一直认为类型为表达式的参数应该用圆括号括起来。powershell.exe "& { Get-ChildItem *.txt | Rename-Item -NewName ( $_.name -Replace '.txt','.csv' ) }" - Vesper
@JamesC。甚至在我的2008R2上,使用Powershell 2.0从cmd.exe也可以工作。 (可惜我对圆括号的判断不正确) - Vesper
@Vesper 在那种情况下需要用大括号。 - Ansgar Wiechers
3个回答

2

这个可以完美地运行:

powershell.exe "& { Get-ChildItem *.txt | Rename-Item -NewName { `$_.name -Replace '.txt','.csv' } }"

对我来说,这个错误显示为“Rename-Item:参数'NewName'的脚本块输入失败。术语'$_.name'不被识别为cmdlet的名称。” - henrycarteruk
如果您想要屏幕截图,我可以发布它。 - Ranadip Dutta
只有在 PowerShell 中运行时才有效,此时您根本不需要 powershell.exe "&{...}"。如果从 PowerShell 之外(例如命令提示符)运行,则会引发错误,而实际上您需要这个结构。 - Ansgar Wiechers

0

我对你的原始命令没有发现任何错误,但个人建议使用 Path.ChangeExtension 方法而非 -replace

powershell.exe -command "& {Get-ChildItem *.txt | Rename-Item -NewName { [io.path]::ChangeExtension($_.name, 'csv') }}"

或者,由于您似乎是从命令行调用PowerShell,因此您可以直接使用“rename”命令(而不使用PowerShell):

ren *.txt *.csv

-2
powershell.exe "& {
    Get-ChildItem -Filter *.txt | ForEach-Object {`$_.Name}
}"

反引号在PowerShell字符串中用于转义特殊字符

`

你已经排除了Rename-Item命令,这是OP代码的关键部分。 - henrycarteruk
@JamesC。我选择发布一些代码,对于未经培训的人来说更不容易造成损害。 - gvee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接