如何按空格拆分PowerShell字符串但忽略双引号内的内容?
这个问题我太熟了!直接用Split(' ')拆分确实会踩坑——引号里带空格的路径本来是一个整体,结果被拆成好几段,完全不符合需求。给你几个亲测有效的解决方案,按需选择:
方法1:用PowerShell内置的令牌解析器(最推荐,无需额外依赖)
PowerShell自带的PSParser可以精准识别命令行参数中的引号包裹内容,把它们当作单个令牌处理,完美解决拆分问题:
$Arguments = '/NOGUI /DATE /EXPAND 4 /SIZEUNIT 3 /SORTTYPE 0 /EXCEL "S:\Test\Brecht\Log Test\Report 13.xlsx" /SHEETNAME "Data set" /SCANPATH "S:\My Folder"' # 解析令牌,过滤掉空格和换行符 $tokens = [System.Management.Automation.PSParser]::Tokenize($Arguments, [ref]$null) $splitArgs = $tokens | Where-Object { $_.Type -notin ('NewLine', 'Space') } | Select-Object -ExpandProperty Content # 查看拆分结果 $splitArgs
执行后你会得到正确的数组,引号里的带空格路径会被完整保留,不会被拆分。
方法2:用System.CommandLine模块(PowerShell 7+适用,专业级)
如果你用的是PowerShell 7及以上版本,可以用微软官方的System.CommandLine模块,专门处理命令行参数解析,功能更强大:
首先安装模块(仅需一次):
Install-Module -Name System.CommandLine -Scope CurrentUser -Force
然后用它解析参数:
$Arguments = '/NOGUI /DATE /EXPAND 4 /SIZEUNIT 3 /SORTTYPE 0 /EXCEL "S:\Test\Brecht\Log Test\Report 13.xlsx" /SHEETNAME "Data set" /SCANPATH "S:\My Folder"' # 初始化解析器并解析参数 $parser = [System.CommandLine.Parser]::For(() => {}) $result = $parser.Parse($Arguments) $splitArgs = $result.Tokens | Where-Object { $_.Type -in ('Argument', 'Option') } | Select-Object -ExpandProperty Value # 输出结果 $splitArgs
方法3:自定义解析函数(兼容所有PowerShell版本)
如果需要兼容老版本PowerShell(比如5.1),可以自己写一个简单的解析函数,手动跟踪引号状态:
function Split-CommandLineArgs { param( [Parameter(Mandatory=$true)] [string]$InputString ) $inQuotes = $false $currentArg = [System.Text.StringBuilder]::new() $argsList = @() foreach ($char in $InputString.ToCharArray()) { # 切换引号状态 if ($char -eq '"') { $inQuotes = -not $inQuotes continue } # 不在引号内时,空格作为分隔符 if ($char -eq ' ' -and -not $inQuotes) { if ($currentArg.Length -gt 0) { $argsList += $currentArg.ToString() $currentArg.Clear() | Out-Null } continue } # 追加字符到当前参数 $currentArg.Append($char) | Out-Null } # 添加最后一个未处理的参数 if ($currentArg.Length -gt 0) { $argsList += $currentArg.ToString() } return $argsList } # 使用自定义函数拆分参数 $Arguments = '/NOGUI /DATE /EXPAND 4 /SIZEUNIT 3 /SORTTYPE 0 /EXCEL "S:\Test\Brecht\Log Test\Report 13.xlsx" /SHEETNAME "Data set" /SCANPATH "S:\My Folder"' $splitArgs = Split-CommandLineArgs -InputString $Arguments $splitArgs
这个函数会逐字符遍历输入字符串,只有当不在引号内时才会把空格当作分隔符,完全保留引号内的内容。
内容的提问来源于stack exchange,提问作者DarkLite1
相关产品推荐
相关产品推荐

