Trong powershell, có cách nào để sao chép vào thư mục cuối cùng trên `pushd`'d stack không?


3

Trong Windows PowerShell (và CMD và bash), thật tuyệt pushdvà sau đó sao chép vào thư mục cuối cùng tôi đã ở. Ví dụ:

> 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

trong đó $ popd sẽ là thư mục cuối cùng được đẩy. Liệu chức năng này có tồn tại hay tôi sẽ cần phải viết một kịch bản?


Chỉnh sửa: Có vẻ như tất cả mọi người đang trả lời các lời khuyên hữu ích để đến gần hơn với giải pháp nhưng chưa hoàn toàn ở đó. Nó có thể không thể trong powershell. Tôi đã tìm kiếm một cái gì đó giống như sau mà tôi đã viết cho cmd nhưng không hoạt động trong 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

Những người có thể dễ dàng dịch? Tôi gặp rắc rối vì rõ ràng không có %cd%hoặc có %path%bất kỳ biến đơn giản nào khác trong powershell.

Câu trả lời:


1

Hãy thử điều này, nên làm những gì tập tin bat cũ của bạn đã làm. Lưu dưới dạng yourName.ps1 và đảm bảo bạn cho phép chạy PowerShell-scripts, bằng cách bắt đầu powershell với tư cách quản trị viên và chạy "Set-ExecutPolicy RemoteSign".

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

3

Trong powershell, khi bạn sử dụng push-location(tức là pushd) nó sẽ lưu trữ vị trí trên ngăn xếp mà sau này bạn có thể truy xuất get-location -Stack. Vì vậy, ví dụ của bạn trông như thế này:

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

Có thể có nhiều vị trí trên ngăn xếp, tùy theo trường hợp bạn sẽ phải sử dụngcp *.pu (get-location -stack).peek()
Rynant

Làm thế nào một người có thể biến chúng thành các tệp bó như tôi đã đăng ở trên trong phần chỉnh sửa câu hỏi? Các quyền hạn tương đương với các tệp bó và biến ... là gì? Tôi không thể có được một cái gì đó đơn giản như %cd%để làm việc ngay cả.
Still.Tony

1

Bạn có thể cố gắng lưu trữ đường dẫn vào một biến (trong ví dụ của tôi, tôi giả sử tôi muốn sử dụng đường dẫn từ nơi tập lệnh được thực thi) và sau đó sử dụng nó khi cần thiết.

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

Đầu tiên, chúng tôi lưu trữ đường dẫn từ nơi tập lệnh được gọi đến $popdbiến. Sau đó chúng tôi thay đổi thư mục thành c:\windows\system32và hiển thị trên màn hình, cũng như đường dẫn gốc (được lưu trữ $popd) và sau đó sử dụng biến đó để thay đổi trở lại thư mục bắt đầu.

Bạn có thể tìm hiểu thêm về Biến tự động, chẳng hạn như $ MyInvocation từ bài viết này của TechNet .

Ngoài ra, Andy Arismendi đã cung cấp một câu trả lời giải quyết cách truy cập ngăn xếp trong PowerShell.


1

Trợ lý từ hiển nhiên:

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

Bạn cũng có thể sử dụng subst(trong 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.