【问题标题】:Concatenate filename with current directory path将文件名与当前目录路径连接起来
【发布时间】:2019-08-22 13:46:10
【问题描述】:

我正在尝试执行一个 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()

我试图连接当前文件夹,因此如果我说将整个文件夹移动到另一个路径,它将起作用。

现在包含 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()

我现在收到此错误:

加入路径:无法将参数绑定到参数“路径”,因为它为空。 在 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

【问题讨论】:

  • ThisWorkbook.Path 在您的上下文中不存在。你应该使用 wb.Path。

标签: powershell


【解决方案1】:

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

改变这个:

$wb = $excel.Workbooks.Open(ThisWorkbook.Path & "\TEMPLATE4WEEKSxlsx")

进入这个:

$wb = $excel.Workbooks.Open("${PSScriptRoot}\TEMPLATE4WEEKS.xlsx")

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

$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent

【讨论】:

    【解决方案2】:

    要使用相对路径而不是物理路径,请使用变量$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()
    

    【讨论】:

    • 注意$pwd是当前工作目录,不一定和脚本所在位置一致。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多