bil*_*man 3 powershell text append
我有一个需要操作的文本文件。文本文件中的示例数据如下所示:
C02324R
C02645R
F06487R
F05564R
S09687R
J03345R
Run Code Online (Sandbox Code Playgroud)
这是需要发生的事情——
因此,最终结果数据将如下所示——
C02324R3
C02645R3
F06487R5
F05564R5
S09687R5
J03345R6
Run Code Online (Sandbox Code Playgroud)
我可以轻松地在 vba excel 中编写此内容,但我对 powershell 缺乏经验。我尝试过 switch、foreach 和 case 语句,大部分来自借用的代码,但似乎无法使其工作。这是我尝试过的一种方法——
switch -file 'C:\MyFile.txt'
{
$_.StartsWith("C") {$_ + "3"}
$_.StartsWith("S0") {$_+ "4"}
$_.StartsWith("S1") {$_ + "5"}
$_.StartsWith("J") {$_ + "6"}
}
$data | Set-Content C:\MyFile.txt -Force*
Run Code Online (Sandbox Code Playgroud)
建议?
要使用任意表达式(例如调用StartsWith())作为 case 谓词来实现此功能,您需要将表达式括在脚本块中:
$data = switch -file 'C:\MyFile.txt'
{
{$_.StartsWith("C")} {$_ + "3"}
{$_.StartsWith("S0")} {$_ + "4"}
{$_.StartsWith("S1")} {$_ + "5"}
{$_.StartsWith("J")} {$_ + "6"}
}
Run Code Online (Sandbox Code Playgroud)
作为替代方案,我个人建议使用-wildcard模式选项:
$data = switch -wildcard -file 'C:\MyFile.txt'
{
"C*" {$_ + "3"}
"S0*" {$_ + "4"}
"S1*" {$_ + "5"}
"J*" {$_ + "6"}
}
Run Code Online (Sandbox Code Playgroud)
更容易阅读:)
正如Theo善意指出的那样,您可能需要添加一个default案例,让不匹配的字符串按原样传递(使用 bareword label default,无论{}模式如何):
$data = switch -wildcard -file 'C:\MyFile.txt'
{
"C*" {$_ + "3"}
"S0*" {$_ + "4"}
"S1*" {$_ + "5"}
"J*" {$_ + "6"}
default { $_ }
}
Run Code Online (Sandbox Code Playgroud)