在 powershell 中,有没有办法复制到“pushd”堆栈上的最后一个目录?

在 powershell 中,有没有办法复制到“pushd”堆栈上的最后一个目录?

在 Windows PowerShell(以及 CMD 和 bash)中,最好将pushd其复制到我所在的最后一个目录。例如:

> pwd
Path
----
D:\Some insanely long\path I really\ don/'t want to type\because it's hard\vimstuff\
> pushd ..\..\..\..\thing that\lives in the swamp
> cp *.pu $popd

其中 $popd 是最后推送的目录。此功能是否存在,还是我需要编写脚本?


编辑:看起来每个人都在回答一些有助于接近解决方案的有用提示,但还没有完全解决。在 powershell 中可能不行。我正在寻找类似下面的东西,我为 cmd 编写了这些内容,但在 powershell 中不起作用:

CPP.BAT:

echo off
if "%olddirp%"=="" (
  echo olddirp not defined, use cdp to push directory before using cpp
) else (
  for %%A in ("" "help" "-help" "/help" "-h" "/h") do (
    if "%1"==%%A goto help
  )
)
copy %1 %olddirp%
echo .\%1 copied to %olddirp%\%1
goto end
:help
echo "cdp / cpp usage: cdp to directory 'cpp c:\newdir' then cpp files to previous directory 'cpp somefile'"
:end

CDP.BAT:

set olddirp=%cd%
cd %1

这些可以轻松翻译吗?我遇到了麻烦,因为 powershell 中显然没有%cd%%path%任何其他简单变量。

答案1

尝试一下,应该可以执行旧 bat 文件所执行的操作。另存为 yourName.ps1,并确保启用 PowerShell 脚本的运行,方法是以管理员身份启动 powershell 并运行“Set-ExecutionPolicy RemoteSigned”。

<#
.SYNOPSIS
Push a folder to stack with "pushd" then call this script with files/filepattern as arguments

.EXAMPLE
script.ps1 *.pu,*.txt
Copies pu files and txt files to last folder pushed to stack.
#>

Param(
  [Parameter(Mandatory=$False, Position=0)]
   [String[]]$files,

   [alias("h")]
   [switch]$help
)

if($help -or !$files)
{
    (Get-Help $MyInvocation.MyCommand.Definition -full)
    exit(0);
}

$CopyToFolder = $null;

try
{
    $CopyToFolder = (get-location -stack).peek();
}
catch
{
    write-host "Stack is empty, use pushd before $($MyInvocation.MyCommand)";
    exit(1);
}


foreach($f in $files)
{
    (copy $f $CopyToFolder);
    write-host ".\$files copied to $CopyToFolder\$files";
}

答案2

在 powershell 中,当您使用push-location(即pushd)时,它会将位置存储在堆栈中,您稍后可以使用 检索该位置get-location -Stack。因此您的示例如下所示:

> pushd ..\..\..\..\thing that\lives in the swamp
> cp *.pu (get-location -stack)

答案3

您可以尝试将路径存储到变量中(在我的示例中,我假设我想使用执行脚本的路径),然后根据需要使用它。

$popd = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent

Set-Location -Path "C:\windows\system32"

Write-Host "Your current location: $(Get-Location)"

Write-Host "Your previous location: $popd"

Set-Location -Path $popd

Write-Host "We're back to: $(Get-Location)"

首先,我们将脚本调用的路径存储到变量中$popd。然后我们将目录更改为c:\windows\system32并在屏幕上显示该目录以及原始路径(存储在中$popd),然后使用该变量更改回起始文件夹。

您可以从以下位置了解有关自动变量(例如 $MyInvocation)的更多信息这篇 TechNet 文章

此外,Andy Arismendi给出了答案它解决了如何在 PowerShell 中访问堆栈。

答案4

显而易见的是:

cd "D:\Some insanely long\path I really\don't want to type again…"
copy "..\..\..\..\thing that\lives in the swamp\*.pu" .

您还可以使用subst(在 Windows 中):

cd "D:\Some insanely long\path I really\don't want to type again…"
subst Z: .
cd "..\..\..\..\thing that\lives in the swamp"
copy *.pu Z:\
subst Z: /d

相关内容