将文件从我的当前目录复制到新目录
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
所以我试图从我的 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