首页 > 解决方案 > PowerShell在文件的输入值中转义单引号

问题描述

通过从文件中读取电子邮件地址,在 Active Directory 中查询用户状态。如果电子邮件地址中没有单引号,它可以工作。如果文件有带引号的电子邮件地址user's@example.com,PowerShell 会给出以下错误消息。

如何在 PowerShell 中转义单引号?

代码

Import-Csv users.csv| 
ForEach-Object{
    
    $UserStatus=Get-ADUser -Filter "EmailAddress -eq '$($_.Email)'" -properties "*"| select -Expand userAccountControl    
$_ |
Add-Member -MemberType NoteProperty -Name "starts" -Value $UserStatus -PassThru
}  |
export-csv added-filed.csv

错误信息

Get-ADUser : Error parsing query: 'EmailAddress -eq 'user's@example.com'' Error Message: 'syntax error' at position: '21'.
At added-active-status.ps1:4 char:17
+ ... $UserStatus=Get-ADUser -Filter "EmailAddress -eq '$($_.Email)'" -prop ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ParserError: (:) [Get-ADUser], ADFilterParsingException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:Microsoft.ActiveDirectory.Management.ADFilterParsingException,Microsoft.ActiveDirectory.Management.Commands.GetADUser

标签: powershell

解决方案


如果这是关于PowerShell 的转义规则,则必须将嵌入的字符加倍。''...'字符串内:-Filter "EmailAddress -eq '$($_.Email -replace "'", "''")'"

但是,鉴于Get-ADUser解释参数内容的是 cmdlet(其底层提供程序),-Filter切换到使用嵌入式"..."引用可能更安全,在这种情况下使用任何'字符。在值中$_.Email不需要转义(假设$_.Email也没有嵌入"字符):

Get-ADUser -Filter "EmailAddress -eq `"$($_.Email)`""

推荐阅读