执行 .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 选项将相对路径转换为绝对路径。