即使路径包含多次出现的方括号,如何获取 Batch-Powershell 混合脚本及其内部的 PowerShell 脚本路径?

问题描述 投票:0回答:1

请参阅下面的脚本,用于重命名具有 .mp4 或 .mkv 扩展名的电影文件:

<# ::

@echo off
powershell -c "iex ((Get-Content -LiteralPath '%~f0') -join [Environment]::Newline); iex 'main %*'"
pause && goto :eof
#>

$path = Split-Path -Path $PSScriptRoot -Parent
echo $path
## $validExtensions = '.mkv', '.mp4'
## Get-ChildItem -LiteralPath $path -File |
##     Where-Object Extension -In $validExtensions |
##     Where-Object Length -GT 500mb |
##     Rename-Item -NewName {
##         ($_.BaseName -replace 'MkvHub.com - ' -replace '(?<=1080p|720p).+' -replace '\.', ' ').ToUpper() + $_.Extension
##     }

目前,我已经注释掉了 Powershell 代码的其余部分,显然是为了测试代码

Split-Path -Path $PSScriptRoot -Parent
split-path $myInvocation.myCommand.path
是否会在执行期间为我们提供同一脚本的文字路径。

显然它没有给我预期的路径,而是抛出这个错误:

Split-Path : Cannot bind argument to parameter 'Path' because it is an empty string.
At line:7 char:26
+ $path = Split-Path -Path $PSScriptRoot -Parent
+                          ~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Split-Path], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.Spli
   tPathCommand

Press any key to continue . . .

还有与

split-path $myInvocation.myCommand.path
类似的错误。

如上所述,我已经尝试了

split-path $myInvocation.myCommand.path
Split-Path -Path $PSScriptRoot -Parent
,但它们都不起作用。

任何人都可以帮忙解决这个问题吗?我必须仅在混合脚本中使其工作......

powershell batch-file path literals hybrid
1个回答
0
投票

从根本上来说,automatic

$PSScriptRoot
$PSCommandPath
仅在脚本文件(*.ps1
(和脚本
module文件(*.psm1
))中定义。

由于您的混合批处理文件方法依赖于调用

powershell.exe

(Windows PowerShell CLI),通过直接将源代码传递到其 -c
 (
-Command
) 参数,因此这些变量
定义。

正如

Mofi 所建议的,您可以在调用 powershell.exe

 之前使用批处理文件自己的目录设置一个变量,由于 
cmd.exe
 变量也是 
环境 变量 - PowerShell 代码可以使用以下命令进行访问: $env:
命名空间。

但是,

强大的混合批处理/PowerShell 解决方案需要使用-File

 PowerShell CLI 参数才能正确处理
传递参数,这又需要创建批处理文件的临时副本作为.ps1
 文件
.

请参阅

这个答案,它将 -File

 方法与通过环境变量传递原始批处理文件路径相结合,允许 PowerShell 代码推断 
$PSScriptRoot$PSCommandPath
等价物

© www.soinside.com 2019 - 2024. All rights reserved.