【问题标题】:Matching $$ using Regex in Powershell在 Powershell 中使用正则表达式匹配 $$
【发布时间】:2016-06-08 11:08:13
【问题描述】:

使用正则表达式测试器:
(?<UserDataPathXP>\\\\[a-zA-Z 0-9]*\\[a-zA-Z 0-9]\$\\[a-zA-Z 0-9]*\\(?>userDataXP>[a-zA-Z 0-9]*\$\$)) 匹配 \\server\e$\users\user1$$

使用 PowerShell 我必须在用户文件路径中的第二个 $ 之前添加一个反引号以使其匹配:

"\\server\e$\users\user1$`$" -match "(?<UserDataPathXP>\\\\[a-zA-Z 0-9]*\\[a-zA-Z 0-9]\$\\[a-zA-Z 0-9]*\\(?<userDataXP>[a-zA-Z 0-9]*\$\$))" True

否则失败:

"\\server\e$\users\user1$$" -match "(?<UserDataPathXP>\\\\[a-zA-Z 0-9]*\\[a-zA-Z 0-9]\$\\[a-zA-Z 0-9]*\\(?<userDataXP>[a-zA-Z 0-9]*\$\$))" False

以下脚本的输入文件包含用户名都包含$$ 的文件路径。我希望正则表达式能够捕获user$$,创建一个仍然带有$$ 的目录,并将文件复制到其中。如何在以下脚本中解决此问题?

$paths = get-content "E:\paths.txt" 
$ArchiveLocation = "\\Server1\Archive" 
$LogsData = Test-Path "$ArchiveLocation\Archived_UserData\Logs"
$LogsProfiles = Test-Path "$ArchiveLocation\Archived_UserProfiles\Logs"

$regxUsrProfPthXP = "(?<UserProfilePathXP>^((?![a-zA-Z 0-9]*\$\$).)*\\\\[a-zA-Z 0-9]*\\[a-zA-Z 0-9]\$\\[a-zA-Z 0-9]*\\(?<userProfileXP>[a-zA-Z 0-9]*\$))"
$regxUsrDataPthXP = "(?<UserDataPathXP>\\\\[a-zA-Z 0-9]*\\[a-zA-Z 0-9]\$\\[a-zA-Z 0-9]*\\(?<userDataXP>[a-zA-Z 0-9]*\$\$))"
if (-not $LogsProfiles) {
    md "$ArchiveLocation\Archived_UserProfiles\Logs"
}

if (-not $LogsData) {
    md "$ArchiveLocation\Archived_UserData\Logs"
}

foreach ($path in $paths) {

    if ($path -match $regxUsrProfPthXP) {
        $path = $matches.UserProfilePathXP
        $user = $matches.userProfileXP
        RoboCopy $path "$ArchiveLocation\Archived_UserProfiles\$user" /MIR /B /COPY:DATSOU /MOVE /LOG+:$ArchiveLocation\Archived_UserProfiles\Logs\$user.log /R:1 /W:1
    }

    if ($path -match $regxUsrDataPthXP) {
        $path = $matches.UserDataPathXP
        $user = $matches.userDataXP
        RoboCopy $path "$ArchiveLocation\Archived_UserData\$user" /MIR /B /COPY:DATSOU /MOVE /LOG+:$ArchiveLocation\Archived_UserData\Logs\$user.log /R:1 /W:1
    }


}

【问题讨论】:

    标签: regex powershell


    【解决方案1】:

    只需在定义regex 和字符串的地方使用单引号,这样您就不需要使用反引号转义$

    '\\server\e$\users\user1$$' -match '(?<UserDataPathXP>\\\\[a-zA-Z 0-9]*\\[a-zA-Z 0-9]\$\\[a-zA-Z 0-9]*\\(?<userDataXP>[a-zA-Z 0-9]*\$\$))'
    

    输出:

    True
    

    所以你要做的就是改变

    $regxUsrProfPthXP = "(?<UserProfilePathXP>^((?![a-zA-Z 0-9]*\$\$).)*\\\\[a-zA-Z 0-9]*\\[a-zA-Z 0-9]\$\\[a-zA-Z 0-9]*\\(?<userProfileXP>[a-zA-Z 0-9]*\$))"
    $regxUsrDataPthXP = "(?<UserDataPathXP>\\\\[a-zA-Z 0-9]*\\[a-zA-Z 0-9]\$\\[a-zA-Z 0-9]*\\(?<userDataXP>[a-zA-Z 0-9]*\$\$))"
    

    $regxUsrProfPthXP = '(?<UserProfilePathXP>^((?![a-zA-Z 0-9]*\$\$).)*\\\\[a-zA-Z 0-9]*\\[a-zA-Z 0-9]\$\\[a-zA-Z 0-9]*\\(?<userProfileXP>[a-zA-Z 0-9]*\$))'
    $regxUsrDataPthXP = '(?<UserDataPathXP>\\\\[a-zA-Z 0-9]*\\[a-zA-Z 0-9]\$\\[a-zA-Z 0-9]*\\(?<userDataXP>[a-zA-Z 0-9]*\$\$))'
    

    【讨论】:

    • 我可以对regex 使用单引号,但是对于通过循环输入不包含引号的文件获取的字符串,我该如何做到这一点?
    • 你不需要在那里做。如果您的 foreach 循环中的 $path 包含 \\server\e$\users\user1$$ 并且您使用单引号定义了您的正则表达式,它将起作用
    • 就这么简单!
    猜你喜欢
    • 2011-08-18
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    相关资源
    最近更新 更多