将文件从我的当前目录复制到新目录

Copy files from my current directory to new directory

所以我试图从我的 Powershell 脚本所在的同一文件夹中复制 2 个文件。我在那里创建了脚本以及 2 个文件 Moveit1.txt,Moveit2.txt 我的脚本是这样的 :

$ScriptDirectory = get-childitem -path $PSScriptRoot
Copy-Item $ScriptDirectory\MoveIt1.txt $env:USERPROFILE + "\AppData\Roaming\" -Force
Copy-Item $ScriptDirectory\MoveIt2.txt "C:\Program Files (x86)\" -Force

但不幸的是它说找不到文件?但是,如果我只检查 $ScriptDirectory 行,它会显示它所在的位置以及里面的文件。我做错了什么?

有一点需要注意:

$ScriptDirectory = Get-ChildItem -Path $PSScriptRoot

$scriptDirectory 除了您的 .ps1 脚本外,很可能还包含 2 个 MoveIt 文件。当你这样做时:

$ScriptDirectory\MoveIt1.txt

我猜 Copy-Item 解释它最终会是这样的:

path\to\script\script.ps1\path\to\script\moveit1.txt\path\to\script\moiveit2.txt\moveit1.txt

尝试这样做:

Copy-Item (Join-Path $PSScriptRoot MoveIt1.txt) (Join-Path $env:USERPROFILE "\AppData\Roaming\") -Force
Copy-Item (Join-Path $PSScriptRoot MoveIt2.txt) "C:\Program Files (x86)\" -Force

关于您的 拒绝访问 问题,它在 运行 作为管理员使用硬编码路径时有效。你可以把它放在脚本的顶部,这样它就会提升自己,但是这会弹出一个 UAC 提示:

$invocation = "-File `"$PSCommandPath`""
Start-Process powershell -Verb Runas -ArgumentList $invocation

您的代码主要问题是一个语法问题 解决了其他问题):

为了传递一个表达式例如

$env:USERPROFILE + "\AppData\Roaming\"

作为命令参数,您需要将其包含在(...)[=47=中].

忽略这样做会传递 三个 个参数,如下面的简化示例所示:

# !! WRONG: Passes *three* arguments instead of the result 
#           of the intended expression.
PS> Write-Output $env:USERPROFILE + "\AppData\Roaming"
C:\Users\jdoe
+
\App\Data\Roaming

# OK: (...) forces a new parsing context, in which the expression is recognized
#     as such.
PS> Write-Output $env:USERPROFILE + "\AppData\Roaming"
C:\Users\jdoe\App\Data\Roaming

顺便说一句:

  • 您可以使用$env:APPDATA直接获取感兴趣的路径,
  • 即使在您确实需要从多个字符串构建路径的情况下,使用 可扩展字符串 代替 + 运算符可能更简单:"$env:USERPROFILE\AppData\Roaming" - 在这种特殊情况下,因为字符串既不包含空格也不包含其他特殊字符(预期的 $ 除外),双引号甚至是 可选 .

有关详细信息,请参阅

try {
    $scriptPath = $PSScriptRoot
    if (!$scriptPath)
    {
        if ($psISE)
        {
            $scriptPath = Split-Path -Parent -Path $psISE.CurrentFile.FullPath
        } else {
            Write-Host -ForegroundColor Red "Cannot resolve script file's path"
            exit 1
        }
    }
} catch {
    Write-Host -ForegroundColor Red "Caught Exception: $($Error[0].Exception.Message)"
    exit 2
}

Write-Host "Path: $scriptPath"


Copy-Item $ScriptPath\onexcuiconcif.xml -Destination "$env:APPDATA\Avaya\Avaya one-x Communicator" -Force
Copy-Item $scriptPath\InstallConfig.xml -Destination "C:\Program Files (x86)\Avaya\Avaya one-X Communicator" -Force