1

Например, я нахожусь в C:\test1 , и у меня есть другой каталог C:\test2\sub2

Я хочу, чтобы инструмент командной строки мог быстро переключиться на sub2 следующим образом:

quickchange sub2

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

Итак, есть ли подходящий инструмент для моих требований в командной строке Windows?

(PS: я не хочу использовать Cygwin)

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

Я знаю, что небольшой инструмент под названием QCD может выполнить эту работу, но QCD долгое время не обновлялся и имеет некоторые ошибки.

11 ответов11

2

Это определенно возможно для Windows Cmd или Power Shell, используя z.lua:

CD в каталог содержит foo:

z foo

cd в каталог заканчивается на foo:

z foo$

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

10   /home/user/work/inbox
30   /home/user/mail/inbox

"z in" будет записываться в /home /user /mail /inbox как запись с более высоким весом. Однако вы можете передать несколько аргументов z.lua, чтобы предпочесть другую запись. В приведенном выше примере "zw in" изменит каталог на /home /user /work /inbox.

Когда найдено несколько совпадений, использование z -i отобразит список:

$ z -i soft
3:  0.25        /home/data/software
2:  3.75        /home/skywind/tmp/comma/software
1:  21          /home/skywind/software
> {CURSOR}

И тогда вы можете ввести номер и выбрать, куда идти до фактического компакт-диска. например. введите 3 для компакт-диска в /home /data /software. И если вы просто нажмете ENTER и ничего не введете, он просто выйдет и останется там, где вы были.

2

Вы на самом деле не можете этого сделать. С технической точки зрения это невозможно.

Представьте, что у вас есть структура папок, подобная этой:

School Work/
    English/
        Assignments/
        Class Work/
        Documents/

    Science/
        Assignments/
        Class Work/
        Documents/

    Math/
        Assignments/
        Class Work/
        Documents/

Теперь, если вы запустили quickchange Documents из папки School Work, в какую папку вы бы хотели перейти? Есть три матча, и нет способа узнать, к какому из них вы действительно хотите добраться. Конечно, он может подсказать вам, какая папка вам нужна, но это не очень хорошо масштабируется

Представьте себе такую же структуру папок для каждого учащегося в школе на сервере, поэтому она выглядит примерно так:

Josh Hunt\
    School Work\
        [etc]

Cathy Wells\
    School Work\
        [etc]

Jack Thompson\
    School Work\
        [etc]

James Smith\
    School Work\
        [etc]

[repeat for all 1300 students]

Понятно, что это плохо масштабируется. Сейчас в папке 3900 документов.

Единственный возможный способ облегчить навигацию по папкам - это использование Tab Completion. Вы бы использовали это так:

/Schoolwork/$ dir E<tab>[nglish/]A<tab>[ssignments/]

Просто для пояснения, <tab> указывает на то, что вы нажали кнопку табуляции на клавиатуре, тогда как [nglish/] указывает, какое заполнение вкладки за вас заменило.

2

Я написал замену cd в Perl более десяти лет назад, которая дает вам ksh-подобные функции (например, CDPATH, cd -, $ OLDPWD) в командной строке DOS. С ним можно делать все, кроме завершения табуляции, чего не может быть, потому что это не замена оболочки, это замена cd , поэтому, когда вы нажимаете <TAB> вы все еще находитесь под командной оболочкой. Мне бы пришлось немного почистить код (так что я не смущен; он довольно тверд с точки зрения ошибок), но я могу опубликовать его, если вам интересно.

Вот встроенная справка для этого:

=============================================================================
cdp - provides UNIX-style cd capabilities under Win32
Copyright (C) 1997-8, Joseph L. Casadonte Jr. All rights reserved.
Version: 2.12

Usage: cdp [-h | -help]
       cdp -
       cdp [-x] [-unix | -dos]
       cdp [-x] -quote <AbsolutePathName>
       cdp [-x] -quote [-look <dir> | -exc <dir>] <Target>
       cdp [-x] <oldpart> <newpart>
       cdp [-x] [-noquote] <AbsolutePathName>
       cdp [-x] [-noquote] [-look <dir> | -exc <dir>] <Target>

Commands are interpretted in the order given above.  Note: the presence of
the -[no]quote option affects the order.

options:
    -h      Get help (this message) and exit
    -help   Get help (this message) and exit

    -x      suppresses the evaluation of $CDP.

    -dos    cdp with no arguments echos current working directory
    -unix   cdp with no arguments changes to root of current directory
            [default: -unix]

    -quote  will assume multiple words in <Target> or <AbsolutePathName>
            are quoted together (i.e. program files will be interpreted
            as 'program files').  May be negated (-noquote).  Used mainly with
            $CDP (see below).  [default: -noquote]

    -look <dir>  will attempt to find a matching directory by appending <dir>
                 to each element of $CDPATH\<Target>, or failing that, by
                 matching an element of $CDPATH\<Target> itself.  May be
                 specified more than once:

                    cdp -look foo -look bar perl5

                 Cannot be used in conjunction with -exc.  Used mainly with
                 $CDP (see below).

    -exc <dir>   will look exclusively for a matching directory by appending
                 <dir> to each element of $CDPATH\<Target>.  If no exact
                 match is found it will *not* match to an element of
                 $CDPATH\<Target> alone.  Cannot be used in conjunction with
                 -look.  Used mainly with $CDP (see below).

cdp -
-----
Will change to the immediately previous directory ala UNIX by using the
$OLDPWD environment variable.

cdp [-unix | -dos]
------------------
Will either change to the root directory (-unix option) or echo the current
directory (-dos option).

cdp [-quote] <AbsolutePathName>
-------------------------------
Will attempt to change into the directory <AbsolutePathName>.  Note:
<AbsolutePathName> is anything that begins with a drive letter (e:\foo), a
front- or back-slash (\temp) or a period (../foo).

cdp [-quote -look <dir> -exc <dir>] <Target>
--------------------------------------------
cdp will use the environment variable $CDPATH to find a valid directory to
change into by appending <Target> to each element in $CDPATH until a match is
found.  $CDPATH (or %CDPATH% for the dos-heads) is a semi-colon delimited
list of directories.  Directories with spaces in them are fine
(i.e. c:\program files) but UNC names are not (i.e. \\machine\share).  The
order of the directories in $CDPATH is important, as the first match wins.
Once a valid directory is found, cdp will change to that directory,
changing drives if necessary.  cdp will not match the current working
directory.

You may include the current directory in the CDPATH environment variable by
using the '.' (i.e. set CDPATH=.;c:\my documents;d:\source).  Most people
will put this at the very beginning of their CDPATH.  It is also extremely
useful if using aliasing (see below).

The two options, -look and -exc, provide ways of extending the match criteria.
If you always change into the source directory of a project (xxx\src), then
you can put the option "-look src" in your $CDP variable, to always look for
a "src" directory when a match on <Target> is found.  Multiple "-look <dir>"
options are resolved in the order given on the command line.  If none are
found, the match to <Target> alone stands.  The "-exc <dir>" option is used to
look exclusively for a particular match to <Target>\<dir>.  If one is not
found, no match is returned (i.e. <Target> alone will not match).  See the
Examples below for more info.

cdp <oldpart> <newpart>
-----------------------
You can substitute a piece of the current directory name specified by <oldpart>
with <newpart>.  For example, if you were in the directory:

   c:\release\really\long\directory\structure\src

you could type:

   cd release debug

and find yourself in:

   c:\debug\really\long\directory\structure\src

assuming it exists.  See examples below.

=============================================================================
Examples
========

Given the following directory structure:

    e:\program files
    e:\program files\perl5
    e:\program files\perl5\docs
    e:\program files\perl4

    e:\program
    e:\program\perl5
    e:\program\perl5\docs

    e:\files
    e:\files\perl5
    e:\files\perl5\docs

and the following Environment Variables:

    set CDPATH=.;e:;e:\program files
    set CDP=-quote
    set OLDPWD=e:\files\perl5

this command                 in this directory       will result in this
-----------------            ---------------------   -------------------------
cdp perl5                    c:\                     e:\program files\perl5
cdp perl5                    e:\program files        e:\program files\perl5
cdp perl5                    e:\program              e:\program\perl5

cdp e:\files\perl5           <anywhere>              e:\files\perl5
cdp \program                 e:\<anywhere>           e:\program
cdp ..\perl5                 e:\program files\perl4  e:\program files\perl5

cdp -unix                    e:\program files\perl5  e:\
cdp -dos                     e:\program files\perl5  e:\program files\perl5

cdp -                        <anywhere>              e:\files\perl5

cdp program files            e:\program\perl5        e:\program files
cdp -x program files         e:\program\perl5        e:\files\perl5
cdp 'program files'          e:\program\perl5        e:\program files
cdp -noquote 'program files' e:\program\perl5        e:\program files
cdp -noquote program files   e:\program\perl5        e:\files\perl5
cdp -x -quote program files  e:\program\perl5        e:\program files

cdp -look docs perl5         c:\                     e:\program files\perl5\docs
cdp -look docs perl4         c:\                     e:\program files\perl4

cdp -exc docs perl5          c:\                     e:\program files\perl5\docs
cdp -exc docs perl4          c:\                     cdp: path not found

=============================================================================
Backslash ('\') vs. Frontslash ('/')
====================================
cdp allows you to use, and even mix, backslashes and frontslashes together.
The following are identical:

   cdp c:\program files\perl5
   cdp c:/program files/perl5
   cdp c:\program files/perl5
   cdp c:/program files\perl5

=============================================================================
Aliasing
========

It is possible to alias the DOS command 'cd' to be cdp.  This way, you
use the features of cdp without having to remember to type a seperate
command.  To do this, you need to use a DOSKEY macro.  For example:

    doskey cd=cdp $*

The "$*" tells DOSKEY to pass all the arguments it received to the new program.

To remove the alias, type:

    doskey cd=

If you ever need to invoke the regular DOS 'cd' command, you can always use
'chdir'.

For more information, type:

    doskey /?

=============================================================================
Environment Variables
=====================
Note: Environment Variables are case sensitive for Perl.

CDPATH - semi-colon delimited list of directories to search thru
         [default: "."]
         [$CDPATH: ".;c:\my documents;l:\gc3\glog_deploy\web\xsl;l:\gc3\glog_deploy\web;l:\gc3\glog\server;l:\gc3\glog\oracle;c:\sandbox;c:\my documents\home_page;\;"]

CDP - a set of default options to be used each time cdp is invoked. This
      is so you do not have to specify the same options every time you use
      cdp.

      These options are processed *before* any options on the command line, and
      can be overridden (i.e. if -quote is set in $CDP, -noquote on the command
      line overrides it).  The use of $CDP can be suppressed by specifying
      the -x option on the command line.
      [$CDP: "-quote"]

CDPFNAME - filename to be used by the Perl script to communicate with the
           surrounding batch script (this is a serious hack!).  Can be changed
           at the top of the script.
           [$CDPFNAME: "c:\temp\cdpath.bat"]

TEMP - used by the scripts to create $CDPFNAME.
       [$TEMP: "c:\temp"]

OLDPWD - used to store the previous directory (see "cdp -" invocation)

=============================================================================
Files used
==========
%TEMP%\cdpath.bat - file used by the Perl script to communicate with the
                    surrounding batch script.  Can be changed to whatever
                    is needed at the top of the script.

=============================================================================
Contacting the Author/Latest Version
====================================
Please send questions, bug reports and comments to: joc@netaxs.com
You can get the latest version at: http://www.netaxs.com/~joc/perl.html

=============================================================================
=============================================================================
1

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

альтернативный текст

ColorConsole является бесплатным и портативным (не требует установки).

1

Вы могли бы также использовать «субстрат»

Это позволит вам назначить букву диска для каталога. Таким образом, вы можете установить каталог \my stuff \what \dunno \ кое-что 'равным X: и вы можете установить' \ more stuff \ not this stuff \ но \ this stuff \ 'в Y:

Теперь вы можете просто использовать букву диска, чтобы делать все то, что вы обычно делаете.

1

Извините за поздний ответ, мне понадобилось пару лет, чтобы найти этот вопрос.

Вы можете использовать пакетный сценарий, который делает это, а затем обратиться к этому пакетному сценарию либо с помощью макроса DOSKEY, либо поместить его в свой путь.

Я написал этот скрипт, он имеет следующие варианты использования:

  1. Если каталог существует без поиска в подкаталогах, переключитесь на него.
  2. Если найдено одно совпадение, переключитесь на него.
  3. Если найдено несколько совпадений, перечислите их и предложите сделать выбор.
  4. Если совпадений не найдено, отобразите "Каталог не найден".
  5. Если аргумент не указан, перечислите все подкаталоги и запросите выбор.

Вот мой сценарий:

@echo off

setlocal enabledelayedexpansion

set target_directory=%1
set /a prompt_index=0
if exist %target_directory% (
    set chosen_path=%target_directory%
    goto :path_set
)
for /f "tokens=*" %%A IN ('dir /s /b /ad %1 2^>nul') do (
    SET /a prompt_index+=1
    set dir_!prompt_index!=%%A
)
if %prompt_index%==0 (
    echo Directory not found
) else if %prompt_index%==1 (
    set chosen_index=1
) else if %prompt_index% GTR 1 (
    for /l %%i in (1, 1, %prompt_index%) do (
        echo %%i. !dir_%%i!
    )
    echo.
    set /p chosen_index="Choose a directory: "
)
set chosen_path=!dir_%chosen_index%!
:path_set
endlocal & set chosen_path=%chosen_path%
if defined chosen_path (
    pushd %chosen_path%
    set chosen_path=
)
0

Попробуйте что-то вроде этого:

@ECHO OFF
goto %1
:docs
cd c:\Users\Phoshi\Documents
GOTO END
:userdir
cd c:\users\Phoshi
GOTO END
:programfiles
cd "c:\program files"
GOTO END
:startup
cd c:\Users\Phoshi\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
GOTO END
:logs
cd "c:\Program Files\Miranda-IM\Logs\"
GOTO END
:music
cd C:\Users\Phoshi\Audio
GOTO END
:pictures
cd C:\Users\Phoshi\Pictures\
GOTO END
:drop
cd "C:\Users\Phoshi\Documents\Drop Box\"
GOTO END
:system32
cd "C:\Windows\System32\"
goto end
:fallout
cd "c:\Program Files\Bethesda Softworks\Fallout 3\"
goto end
:end

Сохраните его как пакетный файл, поместите его по своему пути (например, \system32), а затем введите "go docs", чтобы перейти к вашим документам. Вы могли бы написать небольшую программу, чтобы помочь управлять ими, если хотите, тоже.

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

0

Автозаполнение пути после cd недостаточно быстро? Обычно мне требуется всего 5 или 6 нажатий клавиш, чтобы добраться туда, куда мне нужно идти.

0

Используйте pushd и popd .

C:\Documents and Settings\~quack> pushd d:\foo

D:\foo> pushd e:\bar

E:\bar> popd

D:\foo> popd

C:\Documents and Settings\~quack>

pushd помещает ваш текущий каталог в стек, затем cd в каталог аргументов. Стек может быть настолько большим, насколько вы захотите. popd удаляет каталог в верхней части стека и cd к нему.

0

например, я нахожусь в c:\test1, и у меня есть другой каталог c:\test2\sub2

Я предполагаю, что

c:\test1>cd c:\test2\sub2

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

Я хочу, чтобы инструмент командной строки мог быстро переключиться на sub2 следующим образом:
quickchange sub2
и эта программа может настроить базу данных каталога для всего диска и обновить базу данных вручную.

И если есть (и мы всегда предполагаем, что будет) две директории с именем "sub2"? Эта концепция не совсем так.

Итак, есть ли подходящий инструмент для моей потребности в командной строке Windows?

Есть что-то похожее, смотрите pushd и popd в справке по cmd. Они позволяют быстро переключаться между двумя каталогами.

Посмотреть здесь:

C:\test1>pushd c:\test2\sub2  
c:\test2\sub2>pushd C:\test1  
C:\test1>popd  
c:\test2\sub2>popd  
... to infinity  

но у вас все равно будут проблемы при переключении между несколькими каталогами.

(PS: я не хочу использовать Cygwin)

-2

Как этот cd \s* ?

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