繁体   English   中英

在Powershell中等效于%〜dp0(使用Expand-Archive cmdlet)

[英]%~dp0 equivalent in powershell (using Expand-Archive cmdlet)

我对脚本编写(尤其是Powershell)很陌生,对Stack Overflow还是陌生的,所以请原谅我的无知,请多多包涵! 我将尽最大努力具体说明我要做什么,并希望有人可以对我可以做的事情给出详细的答复。

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

问题:我最近熟悉在批处理文件中使用%〜dp0。 我想确保我的同事最初下载Install.zip的位置不会抛出我的批处理文件。 因此,例如,有些人会将.zip文件下载到“下载”文件夹中,然后将内容提取到正确的目标位置。 其他人会将.zip下载到特定文件夹,然后将其解压缩到该文件夹​​中。 [例如:C:\\ Alex \\ Install.zip-提取-C:\\ Alex \\ Install \\((内容))]因此,由于变量的原因,我尝试不预先定义文件位置。 我已经在批处理文件中将%〜dp0运行到需要的任何地方。 我唯一的问题是让我的Powershell脚本使用批处理文件所在的相同工作目录。*我的批处理文件和Powershell脚本将始终位于同一目录中。 (无论如何)

目标:我希望我的Powershell脚本(“ Unzip.ps1”)在其当前运行目录中查找我的“ Fubar.zip”文件。(再次-可能在任何地方)我基本上想删除所有可能会放弃powershell脚本。 我希望它始终使用其当前工作目录来定位Fubar.zip。 我基本上需要powershell来使用其当前的工作目录,或者想出一种方法来使其拉出其当前的工作目录,并使用该目录来查找“ Fubar.zip”。

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

Unzip.ps1 :Expand-Archive -Force c:\\ ALEX \\ Install.zip \\ Fubar.zip -dest c:\\ TEST \\

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

请记住,我正在学习脚本,并且正在自学。 我的知识是有限的,但是我到目前为止已经做到了,这是我唯一坚持的部分。 请给出明确的答复。 任何帮助或建议,将不胜感激! 使用PowerShell 5.0

提前致谢!

根据您的描述,我认为Fubar.zipUnzip.ps1位于同一目录中。 我们假设这个目录是C:\\Users\\Me\\Temp 尽管我了解可能有所不同。

启动时,Powershell的工作目录将是您所在的目录(如果从CMD调用); 否则,它将来自$env:UserProfile 由于.bat文件始终从其所在目录( C:\\Users\\Me\\Temp )中调用Unzip.ps1 ,因此powershell.exe可以通过此命令找到它(您仍然可以在此处使用%~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将需要如下所示:

Expand-Archive -Force "${PSScriptRoot}\Fubar.zip" -dest 'C:\TEST\'

或者 ,您也可以按照@JosefZ的建议进行一些奇特的路径拆分。 $PSCommandPath$MyInvocation变量包含脚本的完整路径。 您应该熟悉以下内容:

$location = Split-Path $PSCommandPath -Parent
$location = Split-Path $MyInvocation.MyCommand.Path -Parent
Expand-Archive -Force "${location}\Fubar.zip" -dest 'C:\TEST\'

注意: 当然,您不会两次设置$location 我只是向您展示两种设置方式。

我希望这有帮助!

在PowerShell v3 +中, cmd.exe%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\\

在Powershell 3之前

 $currentScriptPath = Split-Path ((Get-Variable MyInvocation -Scope 0).Value).MyCommand.Path

否则, $PsScriptRoot将起作用。 不过,如果您要依赖它,我将确保您将脚本标记为#Requires -version 3

我建议不要更改PWD,除非您必须这样做。 也就是说,直接引用变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM