Netwrix 1Secure 提供跨数据和身份的统一可见性——免费试用14天,享有完全访问权限。开始免费试用

资源中心博客

PowerShell 字符串替换技巧入门指南

PowerShell 字符串替换技巧入门指南

Aug 25, 2025

PowerShell 提供了两种高效的字符串替换方式:用于精确且区分大小写替换的 Replace() 方法,以及用于基于正则表达式、且不区分大小写的模式匹配的 -replace 运算符。这些工具支持从清理配置文件到转换批量数据集的各种任务。通过掌握这两种方法,IT 团队可以自动化文本处理、落实数据标准并简化文件管理。

PowerShell 字符串替换

能够在字符串中查找并替换特定文本,适用于许多任务,包括数据处理、自动化和文件管理。例如,用当前数据替换过时的信息对于数据标准化非常重要。

PowerShell 提供了两种主要的字符串替换方法:

  • Replace() — 这是一种直接的方式,用于将字符串中的精确子串替换为指定内容。它区分大小写,并且不支持正则表达式(regex)。当你已知要替换的精确字符串时,请使用它进行简单的文本替换。
  • -replace operator — 这是一个更强大的选项,支持正则表达式(regex),从而能够进行复杂的模式匹配和替换。用于高级文本处理,例如替换特定模式或使用捕获组。

例如,假设我们想把字符串“Hello”替换为“Hi”。下面是一个使用 Replace() 方法实现此目的的脚本示例:

      $string = "Hello World!"$newString = $string.Replace("Hello", "Hi")Write-Output $newString  # Output: Hi World!And here is an alternative script that uses the -replace operator:$string = "Hello, World!"$newString = $string -replace "Hello", "Hi"Write-Output $newString  # Output: Hi, World!
      

PowerShell Replace 方法:快速对比

要确定在给定的使用场景中哪种 PowerShell 替换(replace)方法最合适,请考虑每种方法的以下特性。

Replace() 方法

  • 要求精确匹配
  • 不支持正则表达式
  • 区分大小写

因此,Replace() 方法最适用于在区分大小写的情况下进行简单且精确的文本替换。

-replace 运算符

  • 支持使用正则表达式进行模式匹配
  • 默认情况下不区分大小写

因此,使用 -replace 运算符通过正则表达式进行高级模式匹配。

下表汇总了每种方法的功能:

Syntax

$string.Replace(“old”, “new”)

$string -replace “old”, “new”

Case sensitivity

Case sensitive

Case-insensitive (by default)

Regex support

No

Yes

Use cases

Simple literal string replacements

Complex pattern matching, dynamic text manipulation

基础入门:在字符串中替换字符和单词

使用 Replace() 方法

在上面的示例中,我们使用 Replace() 方法替换了字符串中的一个单词,如下所示:

      $string = "Hello, World!"$newString = $string.Replace("Hello", "Hi")Write-Output $newString  # Output: Hi, World!
      

你也可以使用 Replace() 方法,通过将字符替换为空字符串来从字符串中移除字符:

      $string = "Hello, World!"$newString = $string.Replace("World", "")Write-Output $newString  # Output: Hello, !
      

使用 -replace 运算符

 -replace  运算符的灵活性比 Replace() 方法更强,尤其是在处理复杂模式或不区分大小写的替换时。例如,下面的脚本将不论其大小写如何,都匹配字符串“hello”:

      $string = "Hello, World!"$newString = $string -replace "hello", "Hi"Write-Output $newString  # Output: Hi, World!If you want the matching to be case sensitive, use the PowerShell -creplace operator instead of ?replace:$string = "Hello, World!"$newString = $string -creplace "hello", "Hi"Write-Output $newString  # Output: Hello, World! (no change)
      

删除字符串或字符

从字符串中移除特定字符或子字符串是文本处理、数据清理、从配置文件中删除过时信息,以及清理文本以提高可读性或兼容性的常见任务。

要使用 Replace() 方法删除某个字符或子字符串,只需将指定文本替换为空字符串(“”)。例如,假设你有一份电子邮件地址列表,并需要移除域名以仅提取用户名:

      $email = "user@example.com"$cleanEmail = $email.Replace("@example.com", "")Write-Output $cleanEmail  # Output: user
      

在 PowerShell 中使用 Replace 搭配正则表达式(Regex)

正则表达式(regular expression)是一串用于定义搜索模式的字符,用于在字符串中进行匹配、验证或提取数据。该模式可以包含字面字符、特殊字符以及量词(quantifiers)。

Regex 还允许你使用括号对模式的部分进行分组。之后,你可以在模式或替换字符串中引用这些分组。

下面是可以用于正则表达式(regex)模式的一些特殊字符:

  • 点号(.)可以匹配任意单个字符。
  • 星号(*)匹配前一个元素出现零次或多次的情况。
  • 加号(+)匹配一次或多次出现的情况。
  • 问号(?)使前一个元素变为可选。
  • {n} 精确匹配 n 次出现。
  • {n,} 至少匹配 n 次出现。

在此脚本中,字符串“.test”中的点号特殊字符可确保匹配以下三个输入字符串:

      $string = "Atest, btest, ctest"$matches = [regex]::Matches($string, ".test")foreach ($match in $matches) {    Write-Output $match.Value}# Output:# Atest# btest# ctest
      

下面是一个使用星号(*)来匹配前一个元素(“ab”)出现零次或多次的示例:

      $string = "a, ab, abb, abbb"$matches = [regex]::Matches($string, "ab*")foreach ($match in $matches) {    Write-Output $match.Value}# Output:# ab# abb# abbb
      

下面是更多适用于 PowerShell 的常见正则表达式(regex)模式示例:

  • 匹配任意数字:\d
  • 匹配任意非数字:\D
  • 匹配任意空白字符:\s
  • 匹配任意非空白字符:\S
  • 匹配任意单词字符:\w
  • 匹配任意非字母数字字符:\W
  • 匹配“a”或“b”任意一个:a|b
  • 匹配方括号中的任意字符:[abc]
  • 匹配不在方括号中的任意字符:[^abc]

下面是一个脚本,它使用 \d 将每个数字替换为井号符号(#):

      $string = "Hello123World456"$newString = $string -replace "\d", "#"Write-Output $newString  # Output: Hello###World###
      

使用文件:在文件中替换字符串

您可以使用 PowerShell 在单个文件或多个文件中替换字符串。这在更新配置文件或日志文件等场景中非常有用。

在单个文件中替换文本

要在单个文件中替换文本,可以使用 Get-Content 和 Set-Content cmdlet。例如,此脚本会读取一个配置文件,将其中所有 “OldValue” 替换为 “NewValue”,并保存更改:

      $file = "C:\Configs\settings.txt"(Get-Content $file) -replace "OldValue", "NewValue" | Set-Content $file# Write the updated content back to the file$updatedContent | Set-Content -Path "C:\config.txt"
      

在多个文件中替换文本

如果需要在多个文件中替换文本,请使用 Get-ChildItem 递归搜索文件,然后使用 Get-Content 和 Set-Content 执行替换。此脚本会搜索 C:\Logs\ 中的所有 .txt 文件,并将“Error”替换为“Warning”:

      Get-ChildItem -Path "C:\Logs\" -Filter "*.txt" -Recurse |ForEach-Object {    (Get-Content $_.FullName) -replace "Error", "Warning" | Set-Content $_.FullName}
      

在处理大型数据集时,提高性能的几个提示:

  • 不要一次性把整个文件加载到内存中,而是使用 Get-Content 并配合 -ReadCount 以批次方式加载。
  • 避免不必要的循环。
  • 使用原生 PowerShell cmdlet。

对于超大文件,你可能需要考虑使用提供比 PowerShell 脚本更快性能的第三方工具。

高级技巧:条件替换与批量替换

条件替换

条件替换允许你仅在满足某个条件时才替换字符串。可以使用 if-else 语句或脚本块来实现。例如,下面的脚本仅在字符串包含“specific”时,才会将“old”替换为“new”:

      $string = "This is old and specific."if ($string -match "specific") {    $newString = $string -replace "old", "new"} else {    $newString = $string}Write-Output $newString  # Output: This is new and specific.
      

批量替换

批量替换是指在一次操作中替换多个字符串。 例如,与其分别运行多个替换命令,不如使用哈希表在一次操作中高效替换多个值:

      $replacements = @{    "old1" = "new1"    "old2" = "new2"    "old3" = "new3"}$string = "This contains old1, old2, and old3."foreach ($key in $replacements.Keys) {    $string = $string -replace $key, $replacements[$key]}Write-Output $string  # Output: This contains new1, new2, and new3.
      

链式替换方法

对于复杂的文本转换,可以将多个 -replace 或 Replace() 方法串联在一起。下面是一个简单脚本示例:通过连续使用 -replace 运算符,对字符串执行多次替换:.

      $string = "This is old1, old2, and old3."$newString = $string -replace "old1", "new1" -replace "old2", "new2" -replace "old3", "new3"Write-Output $newString  # Output: This is new1, new2, and new3.And here is another example that chains uses of the Replace() method:$string = "This contains old1, old2, and old3."$newString = $string.Replace("old1", "new1").Replace("old2", "new2").Replace("old3", "new3")Write-Output $newString  # Output: This contains new1, new2, and new3.
      

面向初学者的 Windows PowerShell 脚本编写教程(PDF)

了解更多

结论

无论你需要处理配置文件、转换数据输出,还是在多个文件中修改文本,PowerShell 的字符串替换功能都能提供无与伦比的灵活性和效率。事实上,-replace 运算符和 Replace() 方法能够实现超越基础“查找并替换”操作的自动化。掌握它们,并结合正则表达式功能,将帮助你轻松应对组织日益复杂的基础设施与数据集。

常见问题

为什么我的 PowerShell 字符串替换不起作用?

最常见的问题是把 Replace() 方法和 -replace 运算符混淆了——它们对大小写的处理方式不同。Replace() 方法默认是区分大小写的,因此这将不起作用:

      "Hello".Replace("hello", "Hi")
      

使用精确的大小写匹配:

      "Hello".Replace("Hello", "Hi")
      

或者改用不区分大小写的 -replace 运算符:

      "Hello" -replace "hello", "Hi"
      

特殊字符也会导致问题,因为它们在正则表达式中具有含义。-replace 运算符使用正则表达式模式,因此需要对 $, \, ., 和 * 等字符进行转义。如果你要替换一个字面量的美元符号:

      "Price: $100" -replace '\$', '£'
      

如果只是进行简单的字面量替换,并且不想涉及正则表达式的复杂性,请使用 Replace() 方法。

另一个容易忽略点是:PowerShell 中的字符串操作不会修改原始字符串——它们会返回一个新的字符串。请务必将结果赋值给变量:

      $result = $originalString -replace "old", "new"
      

如果你只运行不进行赋值的替换命令,你会看到输出,但原始变量仍保持不变。

何时应使用 Replace() 方法,而不是 -replace 运算符?

当你需要进行简单且按字面进行的文本替换(也就是你确切知道要替换成什么文本)时,请使用 Replace() 方法。它在基础操作中通常更快,并且不会将特殊字符解释为正则表达式模式。该方法非常适合用于直接替换,例如替换文件扩展名、修正拼写错误或替换特定单词:

      $filename.Replace(".txt", ".log")
      

当你需要进行模式匹配、不区分大小写的替换或复杂的文本处理时,请选择 -replace 运算符。它支持正则表达式,因此在移除多个空白字符、匹配模式或使用捕获组等高级场景中非常强大。只有在你需要灵活性时,这个运算符才真正发挥优势:

      # Replace multiple spaces with single spaces
$text -replace '\s+', ' '
      

性能同样重要。对于大规模操作,Replace() 方法通常更快,因为它不需要处理正则表达式模式。不过,-replace 运算符能提供更强的控制力和灵活性。在企业环境中(例如处理日志、配置文件或批量数据操作),-replace 的模式匹配能力往往会超过性能差异带来的影响。

如何在 PowerShell 字符串中替换特殊字符?

特殊字符需要根据你使用的替换方法采取不同的处理方式。使用 Replace() 方法时,大多数特殊字符会按字面量(literal)处理:

      $text.Replace('$', 'USD')
      

不过,诸如空字符(null)或控制字符等某些字符可能需要特殊处理。

-replace 运算符使用正则表达式,因此你必须对正则表达式的元字符进行转义。常见的包括 $(使用 \$)、.(使用 \ .)、*(使用 \*)、+(使用 \+)、?(使用 \?)、^(使用 \^)以及 \(使用 \\)。例如:

      # Replace backslashes with forward slashes in file paths
$path -replace '\\', '/'
      

对于更复杂的字符替换,可以考虑使用字符类(character classes)或 Unicode 转义(Unicode escapes)。将任意空白字符替换为 \s,任意数字替换为 \d,或将特定的 Unicode 字符替换为字母 A 的 \u0041。处理用户输入或不受信任的数据时,请在处理前始终验证并清理(sanitize)字符串——这就是 PowerShell 作为安全工具的用武之地,而不仅仅是文本处理器。

在 PowerShell 中如何一次替换多个字符串?

对于简单情况,请串联多个 -replace 操作:

      $text -replace "old1", "new1" -replace "old2", "new2"
      

这种做法易读,且适用于少量替换,但当替换项很多时会变得难以处理。每个操作都会按顺序处理字符串,因此如果替换可能存在冲突,顺序就很重要。

对于更复杂的场景,请使用带有 foreach 循环的哈希表。先创建一个将旧值映射到新值的哈希表,然后遍历它:

      $replacements = @{"old1"="new1"; "old2"="new2"}
$result = $text
$replacements.GetEnumerator() | ForEach-Object {
    $result = $result -replace $_.Key, $_.Value
}
      

这种做法扩展性更好,也能让替换逻辑保持有序。

对于高性能的大批量替换,可以考虑使用带有正则表达式交替(alternation)的 -replace 运算符:$text -replace "(old1|old2|old3)", { switch($_.Value) { "old1" {"new1"} "old2" {"new2"} "old3" {"new3"} } }。该方法在处理多个模式的同时只需处理一次字符串。关键在于让你的方案与数据量以及复杂性需求相匹配。

PowerShell 的替换操作能修改原始字符串吗?

不,PowerShell 的字符串替换操作从不修改原始字符串对象——在 .NET 中,字符串是不可变的。无论是 Replace() 方法还是 -replace 运算符,都会返回应用了更改的新字符串对象。除非你明确地将结果重新赋值回同一个变量,否则原始字符串保持不变。

这种行为可以防止意外的数据损坏,但可能会让初学者感到困惑。运行下面的命令时:

      $name.Replace("John", "Jane")
      

除非你重新赋值,否则原始的 $name 变量仍然包含 “John”:

      $name = $name.Replace("John", "Jane")
      

这种不可变性实际上是一项安全特性——它能防止函数意外修改你的数据。

理解这一概念对于脚本的可靠性和数据完整性至关重要。当需要保留更改时,请始终将替换结果分配给变量:

      $cleanedData = $rawData -replace "[^a-zA-Z0-9]", ""
      

在企业环境中,这种可预期的行为有助于确保在为不同目的转换数据时,日志记录、审计和数据处理操作不会意外损坏源数据。

分享到

了解更多

关于作者

Asset Not Found

Jonathan Blackwell

软件开发负责人

自 2012 年以来,工程师兼创新者 Jonathan Blackwell 一直提供工程领导力,使 Netwrix GroupID 成为 Active Directory 和 Azure AD 环境中群组与用户管理领域的领先者。他在研发、市场与销售方面的经验,使 Jonathan 能够全面理解 Identity 市场以及买家如何思考。