我有一个 PowerShell 脚本,需要以提升的权限从同一目录中调用另一个 PS 脚本。由于脚本需要可移植性,因此脚本文件路径事先是未知的,必须能够处理文件路径中的空格和特殊字符而不会失败。
由于提升 PS 会话会导致当前工作目录更改为 "C:\Windows\System32",因此我需要将当前目录作为参数传递给脚本。现在,我的当前脚本(如下所示)可以很好地处理此问题,只要目录路径中没有特殊字符。
这是我的当前脚本(根据 @mklement0 的建议进行了更新):
但是这种方法并不能保证在所有允许使用的文件夹/文件名字符中都能正常工作。并非所有特殊字符都需要转义,但我需要确保它适用于那些需要转义的字符; 至少适用于可能出现在文件路径中的字符。
我主要关注以下特殊字符(尽管外国字符也可能需要在某个时候进行处理):
由于提升 PS 会话会导致当前工作目录更改为 "C:\Windows\System32",因此我需要将当前目录作为参数传递给脚本。现在,我的当前脚本(如下所示)可以很好地处理此问题,只要目录路径中没有特殊字符。
这是我的当前脚本(根据 @mklement0 的建议进行了更新):
$scriptpath = $MyInvocation.MyCommand.Path
$dir = Split-Path $scriptpath
Start-Process Powershell -Verb runas -ArgumentList "-ExecutionPolicy","Bypass","-File","`"$dir\elevated.ps1`"","`"$dir`""
我尝试转义一些特殊字符,如下所示:
$dir = $dir.Replace('&','`"&`"')
但是这种方法并不能保证在所有允许使用的文件夹/文件名字符中都能正常工作。并非所有特殊字符都需要转义,但我需要确保它适用于那些需要转义的字符; 至少适用于可能出现在文件路径中的字符。
我主要关注以下特殊字符(尽管外国字符也可能需要在某个时候进行处理):
!@#$%^_+-=.,{}`~&()[]
我正在测试的示例目录路径为:
C:\Users\Administrator\Desktop\Test Folder\badname-!@#$%^_+-=.,{}`~&()[]试图从上述位置运行我的脚本会返回以下错误:
指定的通配符字符模式无效: badname-!@#$%^_+-=.,{}\~&()[] + CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : RuntimeException那么,有什么最好的方法使脚本动态处理目录路径中的特殊字符呢?
[
字符(例如[ab]
、[0-9]
),则调用将失败,因为 PowerShell 错误地 将该路径解释为一个 通配符模式 并在发现其格式错误时失败。换句话说:(a) 这应该被视为一个 _bug_。(b) 截至 Windows PowerShell v5.1 / PowerShell Core v6.0.0-beta.6,没有普遍健壮的解决方案。 - mklement0"\
"...`""中不需要
$(Get-Item -LiteralPath $PSScriptRoot\elevated.ps1)- 只需使用
"`"$PSScriptRoot\elevated.ps1`""` 即可。 - mklement0