执行 .ps1 脚本时的 Powershell 问题
Powershell issue when executing .ps1 script
所以,警告,这可能是一个真正的新手问题,所以提前道歉。
我开始学习 Powershell,我想做的第一件事就是创建一个目录并将文件复制到其中。
现在,如果我在 CMD window 中使用以下命令,它们将完美运行。
mkdir %HOMEPATH%\test
cp test.txt %HOMEPATH%\test
但是,当我将它们放入 .ps1 文件并执行它时,我收到一条错误消息,指出找不到目录等(见下文)
Copy-Item : Could not find a part of the path 'C:\Chef\windowsdevbox-master\%HOMEPATH%\.berkshelf
'
现在,我被告知这是因为我需要在每个命令之前放置 CMD。我 运行 这个,每个前面都有 CMD,错误消失了,相反,我看到了 "Home text" 的 CMD,脚本完成了。
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
但是,没有创建文件夹,也没有复制文件。
我只是想知道我需要做什么才能让它工作。
在 PowerShell 中 mkdir
是一个内置函数,旨在模拟相同的功能,但使用内置 cmdlet New-Item
来完成基础工作。
cp
是 PowerShell 的 Copy-Item
cmdlet 的直接别名。
你不需要在它们前面加上 cmd
来使它们起作用。
PowerShell 不接受环境变量的 %VAR%
语法。相反,您将使用特殊的 $env
变量,后跟一个冒号 :
,然后是变量名称:$env:HOME
.
mkdir $env:HOMEPATH\test
cp test.txt $env:HOMEPATH\test
%HOMEPATH%
不是 PowerShell 变量。
环境变量存储在 $env
变量范围内。您可以使用 $env:homepath
.
访问它
在这里,我会使用:
mkdir "${env:homepath}\test";
cp test.txt "${env:homepath}\test";
我可能倾向于使用 mkdir "${env:homedrive}${env:homepath}\test";
,但我真的不知道你想要完成什么。
这里的花括号告诉PowerShell,全部内容都是变量名。冒号容易混淆,IMX,尤其是当你在字符串中嵌入变量时。
环境变量在 PowerShell 中很特殊。他们有自己的供应商。您可以使用 Get-ChildItem env:
列出它们,并在 env:
PSDrive 中操作它们。
附加说明:某些配置可能会产生不可预知的结果,因为字符串可能有太多反斜杠或反斜杠在错误的位置。在这种情况下,您可能需要使用 Join-Path
来正确组合路径。
说:
$env:homedrive
是 'U:'
$env:homepath
是 '\'
子文件夹是 '\test'
那么"${env:homepath}\test'
就是\test
,貌似是UNC路径。相反,您可以使用 Join-Path ${env:homepath} '\test'
,这将正确创建 '\test'
.
如果要加入三个东西,有点复杂:
Join-Path ${env:homedrive} (Join-Path ${env:homepath} '\test')
但这正确地创建了 'U:\test'
而不是 'U:\test'
。
您还可以使用 -Resolve
选项将相对路径转换为绝对路径。
所以,警告,这可能是一个真正的新手问题,所以提前道歉。
我开始学习 Powershell,我想做的第一件事就是创建一个目录并将文件复制到其中。
现在,如果我在 CMD window 中使用以下命令,它们将完美运行。
mkdir %HOMEPATH%\test
cp test.txt %HOMEPATH%\test
但是,当我将它们放入 .ps1 文件并执行它时,我收到一条错误消息,指出找不到目录等(见下文)
Copy-Item : Could not find a part of the path 'C:\Chef\windowsdevbox-master\%HOMEPATH%\.berkshelf
'
现在,我被告知这是因为我需要在每个命令之前放置 CMD。我 运行 这个,每个前面都有 CMD,错误消失了,相反,我看到了 "Home text" 的 CMD,脚本完成了。
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
但是,没有创建文件夹,也没有复制文件。
我只是想知道我需要做什么才能让它工作。
在 PowerShell 中 mkdir
是一个内置函数,旨在模拟相同的功能,但使用内置 cmdlet New-Item
来完成基础工作。
cp
是 PowerShell 的 Copy-Item
cmdlet 的直接别名。
你不需要在它们前面加上 cmd
来使它们起作用。
PowerShell 不接受环境变量的 %VAR%
语法。相反,您将使用特殊的 $env
变量,后跟一个冒号 :
,然后是变量名称:$env:HOME
.
mkdir $env:HOMEPATH\test
cp test.txt $env:HOMEPATH\test
%HOMEPATH%
不是 PowerShell 变量。
环境变量存储在 $env
变量范围内。您可以使用 $env:homepath
.
在这里,我会使用:
mkdir "${env:homepath}\test";
cp test.txt "${env:homepath}\test";
我可能倾向于使用 mkdir "${env:homedrive}${env:homepath}\test";
,但我真的不知道你想要完成什么。
这里的花括号告诉PowerShell,全部内容都是变量名。冒号容易混淆,IMX,尤其是当你在字符串中嵌入变量时。
环境变量在 PowerShell 中很特殊。他们有自己的供应商。您可以使用 Get-ChildItem env:
列出它们,并在 env:
PSDrive 中操作它们。
附加说明:某些配置可能会产生不可预知的结果,因为字符串可能有太多反斜杠或反斜杠在错误的位置。在这种情况下,您可能需要使用 Join-Path
来正确组合路径。
说:
$env:homedrive
是 'U:'
$env:homepath
是 '\'
子文件夹是 '\test'
那么"${env:homepath}\test'
就是\test
,貌似是UNC路径。相反,您可以使用 Join-Path ${env:homepath} '\test'
,这将正确创建 '\test'
.
如果要加入三个东西,有点复杂:
Join-Path ${env:homedrive} (Join-Path ${env:homepath} '\test')
但这正确地创建了 'U:\test'
而不是 'U:\test'
。
您还可以使用 -Resolve
选项将相对路径转换为绝对路径。