请参阅下面的脚本,用于重命名具有 .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
,但它们都不起作用。
任何人都可以帮忙解决这个问题吗?我必须仅在混合脚本中使其工作......
从根本上来说,automatic
$PSScriptRoot
和$PSCommandPath
仅在脚本文件(*.ps1
)(和脚本module文件(
*.psm1
))中定义。由于您的混合批处理文件方法依赖于调用 (Windows PowerShell CLI),通过直接将源代码传递到其
-c
(
-Command
) 参数,因此这些变量未定义。 正如
Mofi 所建议的,您可以在调用 powershell.exe
之前使用批处理文件自己的目录设置一个变量,由于
cmd.exe
变量也是环境 变量 - PowerShell 代码可以使用以下命令进行访问:
$env:
命名空间。但是,
强大的混合批处理/PowerShell 解决方案需要使用-File
PowerShell CLI 参数才能正确处理传递参数,这又需要创建批处理文件的临时副本作为
.ps1
文件. 请参阅
这个答案,它将 -File
方法与通过环境变量传递原始批处理文件路径相结合,允许 PowerShell 代码推断
$PSScriptRoot
和 $PSCommandPath
的等价物
。