将文件名与当前目录路径连接

Bal*_*e47 2 powershell

我正在尝试执行一个PowerShell脚本,该脚本会打开一个Excel文件并对其执行SaveAs。问题是当我放置文件的完整路径时它可以工作,但是我希望将其定向到工作文件夹,这样,如果我将脚本和文件移至其他位置,则无需修改脚本每个环境。

$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$excel.DisplayAlerts = $false
$wb = $excel.Workbooks.Open("E:\TEMP\TEMPLATE4WEEKS.xlsx")#Opening like this works

$wb = $excel.Workbooks.Open(ThisWorkbook.Path & "\TEMPLATE4WEEKS.xlsx") #this is not working 
$wb.SaveAs(ThisWorkbook.Path & "\TEMPLATE4WEEKSprotected.xlsx",[Type]::Missing,"password") #this is not working
$excel.Quit()
Run Code Online (Sandbox Code Playgroud)

我试图连接当前文件夹,所以如果我说将整个文件夹移到另一个路径,它将可以正常工作。

现在,包含PS1脚本的文件夹与包含TEMPLATE4WEEKS.xlsx文件的文件夹相同。我希望所有人都在同一个文件夹中进行操作。

根据Ansgar的回复进行了更改:

$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$excel.DisplayAlerts = $false
$file = Join-Path $excel.ThisWorkbook.Path "TEMPLATE4WEEKS.xlsx"
$wb = $excel.Workbooks.Open($file)
$wb.SaveAs($file,[Type]::Missing,"password")
$excel.Quit()
Run Code Online (Sandbox Code Playgroud)

我现在收到此错误:

Join-Path:无法将参数绑定到参数“ Path”,因为它为null。
在C:\ Users \ AGUIRRG2 \ Desktop \ Newfolder \ PasswordProtect4WEEKSCopy.ps1:4 char:19
+ $ file =联接路径$ excel.ThisWorkbook.Path“ TEMPLATE4WEEKS.xlsx”
+ ~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo:InvalidData:(:) [Join-Path],ParameterBindingValidationException
    + FullyQualifiedErrorId:ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.JoinPathCommand

对不起,我们找不到。是否有可能被移动,重命名或删除?
在C:\ Users \ AGUIRRG2 \ Desktop \ Newfolder \ PasswordProtect4WEEKSCopy.ps1:5 char:1
+ $ wb = $ excel.Workbooks.Open($ file)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo:OperationStopped:(:) [],COMException
    + FullyQualifiedErrorId:System.Runtime.InteropServices.COMException

您不能在空值表达式上调用方法。
在C:\ Users \ AGUIRRG2 \ Desktop \ Newfolder \ PasswordProtect4WEEKSCopy.ps1:6 char:1
+ $ wb.SaveAs($ file,[Type] :: Missing,“ password”)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo:InvalidOperation:(:) [],RuntimeException
    + FullyQualifiedErrorId:InvokeMethodOnNull

Ans*_*ers 5

&在PowerShell中不是串联运算符。另外,您首先不想通过字符串连接构建路径。您也不能ThisWorkbook直接在PowerShell中使用该对象(该对象仅在VBA中有效,并且它是当前宏的位置,因此在这里根本不起作用,因为您没有运行宏)。

更改此:

$wb = $excel.Workbooks.Open(ThisWorkbook.Path & "\TEMPLATE4WEEKSxlsx")
Run Code Online (Sandbox Code Playgroud)

到这个:

$wb = $excel.Workbooks.Open("${PSScriptRoot}\TEMPLATE4WEEKS.xlsx")
Run Code Online (Sandbox Code Playgroud)

注意:自动变量$PSScriptRoot是PowerShell v3引入的,在早期版本中不存在。如果您运行的是旧版本,则需要自己定义,例如:

$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent
Run Code Online (Sandbox Code Playgroud)


T-M*_*-Me 3

要使用相对路径而不是物理路径,请使用变量$pwd。这是您当前的工作目录:

$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$excel.DisplayAlerts = $false
$LoadPath = Join-Path -Path $pwd -ChildPath "TEMPLATE4WEEKS.xlsx"    #$pwd is your current working dir
$SavePath = Join-Path -Path $pwd -ChildPath "TEMPLATE4WEEKSprotected.xlsx"
$wb = $excel.Workbooks.Open($LoadPath)


$wb.SaveAs($SavePath,[Type]::Missing,"password")
$excel.Quit()
Run Code Online (Sandbox Code Playgroud)

  • 请注意,“$pwd”是当前工作目录,不一定与脚本的位置相同。 (2认同)