PowerShell中的%~dp0等效项(使用Expand-Archive cmdlet)

时间:2016-04-04 23:14:21

标签: windows powershell batch-file cmd

我对脚本(特别是PowerShell)和Stack Overflow的新手很新,所以请原谅我的无知,请耐心等待我!我将尽我所能来具体解释我想要做的事情,并希望有人能够详细回应我能做些什么才能让它发挥作用。

预期流程/工作流程:同事下载包含所有必要文件的“Install.zip”文件。此“Install.zip”文件包含“Setup.bat”文件(用于计算机配置),“Fubar.zip”文件,2个powershell脚本和自定义powerplan(.pow)文件。下载后,他们将运行“Setup.bat”文件,它将完成所有工作。在该批处理文件中,它调用2个PowerShell脚本。 1)“Download.ps1” - 从网上下载一些其他文件。 2.)“Unzip.ps1” - 解压缩“Fubar.zip”并将内容放在另一个文件夹中 - C:\ TEST \

问题:我最近熟悉在批处理文件中使用%~dp0。我想确保我的同事最初下载Install.zip的位置不会丢弃我的批处理文件。例如..有些人会将.zip文件下载到“Downloads”文件夹,然后将内容提取到正确的目的地。其他人会将.zip下载到特定文件夹,然后在该文件夹中提取。 [例如:C:\ Alex \ Install.zip --Extraction-- C:\ Alex \ Install \((Content))]因此,我试图不预先定义由于变量而导致的文件位置。我已经让%~dp0在我的批处理文件中需要的任何地方工作。我唯一的问题是让我的powershell脚本使用我的批处理文件所在的相同工作目录。*我的批处理文件和我的powershell脚本将始终位于同一目录中。 (无论在哪里)

目标:我希望我的powershell脚本(“Unzip.ps1”)在其当前运行的同一目录中查找我的“Fubar.zip”文件。(再次 - 无论哪里可能be)我基本上想要删除任何可能会抛弃powershell脚本的变量。我希望它始终使用它的当前工作目录来定位Fubar.zip。我基本上需要powershell来使用它当前的工作目录或找出一种方法让它拉出当前的工作目录并使用它来查找“Fubar.zip”。

我当前的“Unzip.ps1”powershell脚本非常基本。

Unzip.ps1 :展开 - 存档 - 强制c:\ ALEX \ Install.zip \ Fubar.zip -dest c:\ TEST \

调用Unzip.ps1脚本的批处理文件命令: Powershell.exe -executionpolicy remotesigned -File%~dp0UNZIP.ps1

请记住,我只是在学习脚本,而且我在教自己。我的知识是有限的,但我已经做到这一点,这是我唯一坚持的部分。请给出明确答复。任何帮助或建议将非常感谢! 使用PowerShell 5.0

提前致谢!

3 个答案:

答案 0 :(得分:2)

根据您的说明,我认为clang -Rpass-analysis=loop-vectorize Fubar.zip位于同一目录中。我们假装这个目录是Unzip.ps1;虽然我明白这可能会有所不同。

Powershell的工作目录将是您启动时所在的目录(如果从CMD调用);否则,它将来自C:\Users\Me\Temp。由于$env:UserProfile文件始终从它所在的目录.bat中调用Unzip.ps1,所以powershell.exe将使用此命令找到它(您仍然可以在此处使用C:\Users\Me\Temp;它没有伤害任何东西):

%~dp0

powershell.exe -ExecutionPolicy RemoteSigned -File Unzip.ps1 内,您将使用Unzip.ps1

Get-Location

但是,如果Expand-Archive -Force "$(Get-Location)\Fubar.zip" -dest c:\TEST\ 文件在另一个目录中执行了.bat,则无效。从您的cd示例中,我认为情况并非如此,但无论如何我们都要解决它。如果是这种情况,则需要处理脚本位置的位置。因此,为此调用%~dp0UNZIP.ps1的完整/关系路径:

.ps1

然后,您的powershell.exe -ExecutionPolicy RemoteSigned -File C:\Users\Me\Temp\Unzip.ps1 将需要如下所示:

Unzip.ps1

或者,你也可以做一些奇特的路径分割,就像@JosefZ建议的那样。 Expand-Archive -Force "${PSScriptRoot}\Fubar.zip" -dest 'C:\TEST\' $PSCommandPath变量包含脚本的完整路径;您应该熟悉哪些:

$MyInvocation

注意: 当然,您不会设置$location = Split-Path $PSCommandPath -Parent $location = Split-Path $MyInvocation.MyCommand.Path -Parent Expand-Archive -Force "${location}\Fubar.zip" -dest 'C:\TEST\' 两次。我只是向您展示了两种设置方法。

我希望这有帮助!

答案 1 :(得分:1)

PowerShell v3 +中cmd.exe' s %dp0的等价物为$PSScriptRoot

两个构造都扩展到包含手头批处理文件/ PowerShell脚本的文件夹的绝对路径 (唯一的区别是%dp0包含尾随\,与$PSScriptRoot不同。

因此,要在脚本本身所在的同一文件夹中创建Unzip.ps1脚本引用Fubar.zip,请使用:

Expand-Archive -Force $PSScriptRoot\Fubar.zip -dest c:\TEST\
  • 将路径构建为$PSScriptRoot\Fubar.zip - 即盲目地将变量值和文件名加入\ - 是更恰当地表达为(Join-Path $PSScriptRoot Fubar.zip)的实用快捷方式。在这种情况下使用是安全的,但请参阅有关何时应使用Join-Path的讨论的评论。

  • 自动$PSScriptRoot变量需要PS v3 +;在v2-中,使用
    Expand-Archive -Force ((Split-Path $MyInvocation.Mycommand.Path) + '\Fubar.zip') -dest c:\TEST\

答案 2 :(得分:0)

在Powershell 3之前

enterprise

否则, $currentScriptPath = Split-Path ((Get-Variable MyInvocation -Scope 0).Value).MyCommand.Path 将起作用。但是,如果您依赖它,我确保您使用$PsScriptRoot

标记脚本 除非你必须,否则我建议不要改变残疾人士。也就是说,直接引用变量。