是否替换powershell中的部分变量而不替换其余变量?

是否替换powershell中的部分变量而不替换其余变量?,powershell,replace,copy,ps1,Powershell,Replace,Copy,Ps1,因此,我有一个PowerShell脚本,它将通过替换来替换Youtube URL。”https://www.youtube.com/watch?v=“到”id=“而不删除URL的id 示例: 之前的copyboard变量:https://www.youtube.com/watch?v=FigUL6NWtqw copyboard变量然后:id=FigUL6NWtqw 以下是我已经尝试过的: 动力壳 $Copyboard = Get-Clipboard | Out-String $Copyboard

因此,我有一个PowerShell脚本,它将通过替换
来替换Youtube URL。”https://www.youtube.com/watch?v=“
”id=“
而不删除URL的id

示例:
之前的copyboard变量:
https://www.youtube.com/watch?v=FigUL6NWtqw

copyboard变量然后:
id=FigUL6NWtqw

以下是我已经尝试过的:

动力壳

$Copyboard = Get-Clipboard | Out-String
$Copyboard = $Copyboard -replace "https://www.youtube.com/watch?v=", "id="

可以使用Regex
-Replace
操作符来实现结果。这将用
id
替换第一个
=
字符之前的所有内容

$Copyboard = $Copyboard -Replace "^[^=]+","id"
使用
-Split
运算符,可以将
id=
前置到查询值。我使用
=
字符作为分隔符进行拆分,并使用
[1]
索引返回
=
之后的所有数据。这里我使用了格式操作符(
-f
),但是您可以使用您选择的任何连接技术

$Copyboard = "{0}{1}" -f 'id=',($Copyboard -Split "=")[1]
另一种方法是首先将
$Copyboard
转换为
[uri]
,只有在不使用新值重新分配
$Copyboard
的情况下,才会为代码打开其他选项。然后访问要更改的属性(
query,在本例中为
),并仅输出已更改的属性。对于uri对象,复制的uri的不同部分被分解为子部分,并且生成的子部分被存储为对象的属性

使用regex
-将
运算符替换为uri对象:

([uri]$copyboard).Query -Replace "^[^=]+","id"

源字符串“.”和“?”中有一些正则表达式字符。主要是问号把你搞砸了。(不带“|输出字符串”)

您可以使用转义版本:

$a -replace [regex]::escape('https://www.youtube.com/watch?v='), 'id='
还是反斜杠?:

$a -replace 'https://www.youtube.com/watch\?v=', 'id='
或者不使用正则表达式的.net.replace()

$a.replace('https://www.youtube.com/watch?v=', 'id=')

听起来您只需要从输入字符串中提取最后一个基于
=
的令牌,这是使用
-split
操作符最容易(但不是最快)完成的:

$Copyboard = 'id=' + ((Get-Clipboard -Format Text) -split '=')[-1]
注意使用
-Format Text
确保从剪贴板检索文本

索引
[-1]
从标记数组中检索最后一个元素,该标记是通过
=
使用
-split'='
将字符串拆分而得到的,即使用示例输入的
FigUL6NWtqw


顺便说一句:这里没有什么区别,但请注意,PowerShell的
-split
操作符与.NET
.split()
方法不同,它通过正则表达式进行拆分,通常比
.split()更强大
-请参阅以了解更多信息。

1st-不要使用
输出字符串
,因为它有时会在源代码中添加新行之类的内容。另外,您的剪贴板输入可能已经是一个字符串了。//第二-您的URL中有正则表达式特殊字符[例如,句点],在您可以对其使用
-replace
之前需要对其进行转义。那个操作符使用正则表达式。您可以在URL上使用
[regex]::Escape()
。。。或者您可以使用
.Replace()
string方法-它不使用regex。另外,还有其他方法。。。例如,拆分字符串。[咧嘴笑]请允许我向新来者提供标准建议:如果一个答案解决了您的问题,请单击大复选标记接受它(✓) 在它旁边,也可以选择向上投票(向上投票要求至少15个信誉点)。如果您发现其他答案有帮助,请向上投票。接受(您将获得2个信誉点)和向上投票有助于未来的读者。有关更多信息,请参阅。如果您的问题尚未完全回答,请提供反馈或建议。
$Copyboard = 'id=' + ((Get-Clipboard -Format Text) -split '=')[-1]