No powershell, existe uma maneira de copiar para o último diretório na pilha 'pushd'd'?

3

No Windows PowerShell (e CMD e bash) seria interessante pushd e depois copiar para o último diretório em que eu estava. ex:

> 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

onde $ popd seria o último diretório enviado. Esta funcionalidade existe ou eu precisaria escrever um script?

Editar: parece que todos estão respondendo a dicas úteis para se aproximar da solução, mas ainda não chegaram lá. Pode não ser possível no powershell. Eu estava procurando algo como o seguinte que escrevi para o cmd mas não funciona no 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

Esses podem ser facilmente traduzidos? Eu tive problemas porque aparentemente não há %cd% ou %path% ou qualquer outra variável simples no powershell.

    
por Still.Tony 21.02.2014 / 22:45

4 respostas

1

Tente isso, deve fazer o que seu arquivo bat antigo fez. Salve como yourName.ps1 e ative a execução dos scripts do PowerShell, iniciando PowerShell como admin e executando "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";
}
    
por 24.02.2014 / 23:01
3

No powershell, quando você usa push-location (ou seja, pushd ), ele armazena o local em uma pilha que você pode recuperar posteriormente com get-location -Stack . Então, seu exemplo é assim:

> pushd ..\..\..\..\thing that\lives in the swamp
> cp *.pu (get-location -stack)
    
por 22.02.2014 / 01:40
1

Você poderia tentar armazenar o caminho em uma variável (no meu exemplo, suponho que eu queira usar o caminho de onde o script foi executado) e, em seguida, usá-lo conforme necessário.

$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)"

Primeiro, armazenamos o caminho de onde o script foi chamado para a variável $popd . Em seguida, alteramos o diretório para c:\windows\system32 e exibimos isso na tela, bem como o caminho original (que foi armazenado em $popd ) e usamos essa variável para voltar à pasta inicial.

Você pode aprender mais sobre as variáveis automáticas, como $ MyInvocation, de este artigo da TechNet .

Além disso, Andy Arismendi tem forneceu uma resposta que aborda como acessar a pilha no PowerShell.

    
por 21.02.2014 / 23:25
1

Aide do óbvio:

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

Você também pode usar subst (no 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
    
por 21.02.2014 / 23:44