3

В Windows PowerShell (и CMD, и bash) было бы неплохо pushd и затем скопировать в последний каталог, в котором я находился. 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

где $ 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% или какой-либо другой простой переменной.

4 ответа4

3

В PowerShell, когда вы используете push-location (то есть pushd), он сохраняет местоположение в стеке, которое вы можете позже получить с помощью get-location -Stack . Итак, ваш пример выглядит так:

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

Вы можете попытаться сохранить путь в переменной (в моем примере я предполагаю, что хочу использовать путь, из которого был выполнен скрипт), а затем использовать его по мере необходимости.

$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.

Кроме того, Энди Арисменди предоставил ответ, в котором рассматривается, как получить доступ к стеку в PowerShell.

1

Помощник от очевидного:

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
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";
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .