![在 powershell 中,有没有办法复制到“pushd”堆栈上的最后一个目录?](https://linux22.com/image/1398745/%E5%9C%A8%20powershell%20%E4%B8%AD%EF%BC%8C%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E5%A4%8D%E5%88%B6%E5%88%B0%E2%80%9Cpushd%E2%80%9D%E5%A0%86%E6%A0%88%E4%B8%8A%E7%9A%84%E6%9C%80%E5%90%8E%E4%B8%80%E4%B8%AA%E7%9B%AE%E5%BD%95%EF%BC%9F.png)
在 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