Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何在Powershell正则表达式中转义双引号和其他麻烦字符_Regex_Powershell_Powershell 2.0 - Fatal编程技术网

Regex 如何在Powershell正则表达式中转义双引号和其他麻烦字符

Regex 如何在Powershell正则表达式中转义双引号和其他麻烦字符,regex,powershell,powershell-2.0,Regex,Powershell,Powershell 2.0,我在一个脚本中遇到了一个障碍,我正在编写一个脚本来下载最新的安装包,而不需要使用巧克力或凯达林。不幸的是,一些实用程序并没有在直接下载链接中提供,而是隐藏在重定向URL之后,下载URL将在15分钟后过期。让事情更复杂一点,我在PowerShell2中这样做,因为我们办公室里有一些Vista机器 在研究了其他类似的场景之后,我似乎可以调用.NET WebClient来处理下载,尽管没有进度条。由于在.NET WebClient上运行了一段时间后,我还没有找到处理重定向后下载文件的代码示例,因此我决

我在一个脚本中遇到了一个障碍,我正在编写一个脚本来下载最新的安装包,而不需要使用巧克力或凯达林。不幸的是,一些实用程序并没有在直接下载链接中提供,而是隐藏在重定向URL之后,下载URL将在15分钟后过期。让事情更复杂一点,我在PowerShell2中这样做,因为我们办公室里有一些Vista机器

在研究了其他类似的场景之后,我似乎可以调用.NET WebClient来处理下载,尽管没有进度条。由于在.NET WebClient上运行了一段时间后,我还没有找到处理重定向后下载文件的代码示例,因此我决定可以使用WebClient请求加载页面,然后使用以下正则表达式从页面获取当前的直接下载URL,然后使用一个正则表达式到该URL下载文件。我已经与regexr.com进行了检查,以验证regex是否捕获了下面的示例URL

示例URL

<a href="https://www.example.com/randomstring003ejdjd38/dl/ProgramName.exe">CF DL here</a>

正则表达式

)
如果(”https://www.example.com/randomstring003ejdjd38/dl/ProgramName.exe“-匹配$downloadLinkRegex){
写主机“耶”
}否则{
写入主机“nope”}
试图逃走?使用反勾号也会失败。正则表达式对我来说是难以置信的困难,所以在这一点上,我不知道如何让ISE认识到这是一个有效的正则表达式,它不需要验证,它可以存储为变量的值,以便稍后在webrequest的内容中调用


如果有人能指出我哪里出了问题,或者如何解决这个问题,我将不胜感激。

但它在regexr.com上不匹配。。。?它失败是因为它认为
是正则表达式的结尾。它也会失败,因为它正在尝试匹配ProgramNam(一个或无限的“e”)并忽略
.exe
位。(还有“不能匹配八进制数字1”?这可能不是你想要的(不,我不知道,我只是在regex101.com上挠头破译时看到的)

无论如何,对于您的问题:PowerShell没有regex文本,所以您不能只编写

$pattern=“”
$url-匹配$pattern
$Matches[1]
我在外面用双引号引用了字符串。然后我使用了反勾号来转义模式中的双引号


在regex模式是

的地方,我能想到的最简单的方法是使用powershell中的@“bla”块(我不知道官方名称)。 例如: $regex=@” 在此处插入正则表达式 "@
@“@块之间的所有内容都将被视为字符串值。

实际上,我将正则表达式修改为更简单的格式来解决这个问题。虽然URL会不断更改,但文件名不会更改,因此我将重点放在文件名上,而不是整个URL上,并且能够获取所需的URL。

我只是删除了PowerShell标志项。我必须测试几种不同的方法,以确保这是PowerShell允许我打印到HTML的唯一方法。即使转换为HTML也无法绕过PowerShell的问题。它是HTML的混合体。我还注意到,PowerShell在您键入时不注意空格,因此我的真实代码有很多空格和空行来区分我的脚本

$My_HTML_table = "<!DOCTYPE html>
<head><title> My Excellent Page </title></head>
<H2> Table 1 </H2>
<text></text>
<table border=1;border-style:solid>
<tr>
<td colspan=1 style=color:blue;background-color:#CCCCCC;font-size:18;padding:5px> Cute Header </td>
</tr>"
$My_HTML_table > C:\File_Path\My_Excellent_HTML.html
$My\u HTML\u table=”
我的精彩页面
表1
可爱的头球
"
$My\u HTML\u table>C:\File\u Path\My\u Excellent\u HTML.HTML
看起来不错

$a='<a href="https://www.example.com/randomstring003ejdjd38/dl/ProgramName.exe">CF DL here</a>'
$a -match '(?<=ef=")[^"]+?(\w+).(exe|pdf)'
Iwr $matches[0] -outfile "$($matches[1]).$($matches[2])"
$a=''

$a-比赛'(?看起来好像我把正则表达式弄错了。不幸的是,你提供的正则表达式抓住了页面上的每一个链接,而不仅仅是文件名。我已经在这里测试过了:我要用更正后的正则表达式编辑我的原始文章。它被称为here string。在这里双引号字符串扩展变量
$VariableName
和子表达式
 $()
。因此,必须使用单引号此处字符串,才能将内容视为文字字符串值。
$url = '<a href="https://www.example.com/randomstring003ejdjd38/dl/ProgramName.exe">CF DL here</a>'

$pattern = "<a.*?href=[`"'](.*?)[`"'][^>]*>.*?</a>"

$url -match $pattern
$Matches[1]
$My_HTML_table = "<!DOCTYPE html>
<head><title> My Excellent Page </title></head>
<H2> Table 1 </H2>
<text></text>
<table border=1;border-style:solid>
<tr>
<td colspan=1 style=color:blue;background-color:#CCCCCC;font-size:18;padding:5px> Cute Header </td>
</tr>"
$My_HTML_table > C:\File_Path\My_Excellent_HTML.html
$a='<a href="https://www.example.com/randomstring003ejdjd38/dl/ProgramName.exe">CF DL here</a>'
$a -match '(?<=ef=")[^"]+?(\w+).(exe|pdf)'
Iwr $matches[0] -outfile "$($matches[1]).$($matches[2])"