处理包含带括号路径的变量

Dealing with a variable containing a path with brackets

我为此苦苦挣扎

$test =  "C:\[1]test.mp3"
$FilePath = dir $test
Write-Host "FilePath: " $FilePath 

无法识别路径(如果名称不包含方括号,则代码有效)。

我找到了this info from MS,我试了没有成功:

$FilePath = dir $(-LiteralPath $test)

其他的问题都是比较复杂的问题,我没有找到关于这个基本问题的任何信息。

在您的字符串周围使用单引号:

$test =  'C:\[1]test.mp3'

使用单引号时,Powershell 不会尝试执行字符串替换。

更新 1

@LotPings 感谢评论。

您必须使用 Get-ChildItem-LiteralPath 参数,documentation:

-LiteralPath

Specifies a path to one or more locations. The value of LiteralPath is used exactly as it is typed. No characters are interpreted as wildcards. If the path includes escape characters, enclose it in single quotation marks. Single quotation marks tell PowerShell not to interpret any characters as escape sequences.

示例:

> Get-ChildItem


    Directory: C:\Temp\soTest

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        22.08.2019    10:05              0 [1] abc.txt

> $test =  '.\[1] abc.txt'
> Get-ChildItem -LiteralPath $test


    Directory: C:\Temp\soTest

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        22.08.2019    10:05              0 [1] abc.txt


dirGet-ChildItem 的别名。 LiteralPath 参数对您不起作用,因为您没有以正确的方式使用它。

因此您必须将代码从 $FilePath = dir $(-LiteralPath $test) 更改为

$FilePath = dir -LiteralPath $test

作为补充阅读,您尝试做的事情称为子表达式运算符。您可以在 docs.

中阅读更多相关信息

方括号是PowerShell中的一个特殊字符,用于正则表达式之类的东西,所以在指定file/directory名称时不能直接使用它。而是尝试使用双反引号转义它们,如下所示:

$test =  'C:\``[1``]test.mp3'

这应该使您能够 运行 您的 dir 命令(Get-ChildItem 的别名),尽管您可能仍然遇到一些麻烦,具体取决于您如何处理这些命名文件。

根据允许您对文件执行的操作,您可能希望替换方括号,例如

$test = 'C:\``[1``]test.mp3'
$testName = (Get-ChildItem $test).Name
$newName = $testName -replace '\[','(' -replace '\]',')'
Move-Item -LiteralPath $testName $test2

其中有些事情可能有点棘手,但希望对您有所帮助。