В powershell есть ли способ скопировать в последний каталог в стеке`pushd " d?

в Windows PowerShell (и CMD и bash) было бы неплохо pushd а затем скопировать в последний каталог, в котором я был. пример:

> pwd
Path
----
D:Some insanely longpath I really don/'t want to typebecause it's hardvimstuff
> pushd ........thing thatlives in the swamp
> cp *.pu $popd

, где $popd будет последним каталогом. Существует ли эта функция или мне нужно написать сценарий?


Edit: похоже, что все отвечают на полезные советы по приближению к решению, но еще не совсем. Это может быть невозможно в powershell. Я искал что-то вроде после этого я написал для cmd, но не работает в powershell:

CPP.Летучая мышь:

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.Летучая мышь:

set olddirp=%cd%
cd %1

могут ли они быть легко переведены? У меня были проблемы, потому что, видимо, нет %cd% или %path% или любой другой простой переменной в PowerShell.

14
задан Still.Tony
20.11.2022 4:57 Количество просмотров материала 3333
Распечатать страницу

4 ответа

попробуйте это, должно сделать то, что сделал ваш старый файл bat. Сохранить как ваше имя.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";
}
1
отвечен Martin 2022-11-21 12:45

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

> pushd ..\..\..\..\thing that\lives in the swamp
> cp *.pu (get-location -stack)
3
отвечен zdan 2022-11-21 15:02

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

$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 из этой статье.

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

1
отвечен JSanchez 2022-11-21 17:19

помощник из очевидного:

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
отвечен Synetech 2022-11-21 19:36

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх