- GetWindowsDirectoryA function (sysinfoapi.h)
- Syntax
- Parameters
- Return value
- Remarks
- Examples
- Управление текущим расположением Managing Current Location
- Получение текущего расположения (Get-Location) Getting Your Current Location (Get-Location)
- Настройка текущего расположения (Set-Location) Setting Your Current Location (Set-Location)
- Сохранение и отзыв последних расположений (Push-Location и Pop-Location) Saving and Recalling Recent Locations (Push-Location and Pop-Location)
- Get Parent directory of a specific path in batch script
- 3 Answers 3
GetWindowsDirectoryA function (sysinfoapi.h)
Retrieves the path of the Windows directory.
This function is provided primarily for compatibility with legacy applications. New applications should store code in the Program Files folder and persistent data in the Application Data folder in the user’s profile. For more information, see ShGetFolderPath.
Syntax
Parameters
A pointer to a buffer that receives the path. This path does not end with a backslash unless the Windows directory is the root directory. For example, if the Windows directory is named Windows on drive C, the path of the Windows directory retrieved by this function is C:\Windows. If the system was installed in the root directory of drive C, the path retrieved is C:.
The maximum size of the buffer specified by the lpBuffer parameter, in TCHARs. This value should be set to MAX_PATH.
Return value
If the function succeeds, the return value is the length of the string copied to the buffer, in TCHARs, not including the terminating null character.
If the length is greater than the size of the buffer, the return value is the size of the buffer required to hold the path.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
Remarks
The Windows directory is the directory where some legacy applications store initialization and help files. New applications should not store files in the Windows directory; instead, they should store system-wide data in the application’s installation directory, and user-specific data in the user’s profile.
If the user is running a shared version of the system, the Windows directory is guaranteed to be private for each user.
If an application creates other files that it wants to store on a per-user basis, it should place them in the directory specified by the HOMEPATH environment variable. This directory will be different for each user, if so specified by an administrator, through the User Manager administrative tool. HOMEPATH always specifies either the user’s home directory, which is guaranteed to be private for each user, or a default directory (for example, C:\USERS\DEFAULT) where the user will have all access.
Terminal Services:В В If the application is running in a Terminal Services environment, each user has a private Windows directory. There is also a shared Windows directory for the system. If the application is Terminal-Services-aware (has the IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE flag set in the image header), this function returns the path of the system Windows directory, just as the GetSystemWindowsDirectory function does. Otherwise, it retrieves the path of the private Windows directory for the user.
Examples
The sysinfoapi.h header defines GetWindowsDirectory as an alias which automatically selects the ANSI or Unicode version of this function based on the definition of the UNICODE preprocessor constant. Mixing usage of the encoding-neutral alias with code that not encoding-neutral can lead to mismatches that result in compilation or runtime errors. For more information, see Conventions for Function Prototypes.
Управление текущим расположением Managing Current Location
При навигации по системам папок в проводнике у вас обычно есть определенное рабочее расположение, т. е. текущая открытая папка. When navigating folder systems in File Explorer, you usually have a specific working location — namely, the current open folder. Элементами в текущей папке можно легко управлять, щелкая их. Items in the current folder can be manipulated easily by clicking them. Когда в интерфейсе командной строки (например, Cmd.exe) открыта папка, в которой находится определенный файл, вы можете получить к нему доступ, указав короткое имя, а не вводить весь путь к файлу. For command-line interfaces such as Cmd.exe, when you are in the same folder as a particular file, you can access it by specifying a relatively short name, rather than needing to specify the entire path to the file. Текущий каталог называется рабочим. The current directory is called the working directory.
Windows PowerShell использует существительное Location для ссылки на рабочий каталог и реализует семейство командлетов для просмотра расположения и управления им. Windows PowerShell uses the noun Location to refer to the working directory, and implements a family of cmdlets to examine and manipulate your location.
Получение текущего расположения (Get-Location) Getting Your Current Location (Get-Location)
Чтобы определить путь к текущему каталогу, введите команду Get-Location : To determine the path of your current directory location, enter the Get-Location command:
Командлет Get-Location аналогичен команде pwd в оболочке BASH. The Get-Location cmdlet is similar to the pwd command in the BASH shell. Командлет Set-Location аналогичен команде cd в Cmd.exe. The Set-Location cmdlet is similar to the cd command in Cmd.exe.
Настройка текущего расположения (Set-Location) Setting Your Current Location (Set-Location)
Команда Get-Location используется с командой Set-Location . The Get-Location command is used with the Set-Location command. Команда Set-Location позволяет вам указать расположение текущего каталога. The Set-Location command allows you to specify your current directory location.
Обратите внимание, что после ввода команды вы не получите прямого отклика о действии команды. After you enter the command, you will notice that you do not receive any direct feedback about the effect of the command. Большинство команд Windows PowerShell, выполняющих действия, практически не создают выходных данных, так как выходные данные не всегда полезны. Most Windows PowerShell commands that perform an action produce little or no output because the output is not always useful. Чтобы проверить успешность внесения изменения в каталог при вводе команды Set-Location , включите параметр -PassThru при вводе команды Set-Location : To verify that a successful directory change has occurred when you enter the Set-Location command, include the -PassThru parameter when you enter the Set-Location command:
Параметр -PassThru можно использовать с некоторыми командами Set в Windows PowerShell для возврата сведений о результате в случае отсутствия выходных данных по умолчанию. The -PassThru parameter can be used with many Set commands in Windows PowerShell to return information about the result in cases in which there is no default output.
Вы можете указать пути относительно текущего расположения так же, как и в большинстве командных оболочек UNIX и Windows. You can specify paths relative to your current location in the same way as you would in most UNIX and Windows command shells. В стандартной нотации для относительных путей точка ( . ) представляет текущую папку, а две точки ( .. ) — родительский каталог текущего расположения. In standard notation for relative paths, a period ( . )represents your current folder, and a doubled period ( .. ) represents the parent directory of your current location.
Например, если вы находитесь в папке C:\Windows , точка ( . ) представляет C:\Windows , а две точки ( .. ) представляют C: . For example, if you are in the C:\Windows folder, a period ( . )represents C:\Windows and double periods ( .. ) represent C: . Текущее расположение можно изменить на корень диска C: путем ввода следующей команды: You can change from your current location to the root of the C: drive by typing:
Тот же метод работает в дисках Windows PowerShell, которые не являются дисками файловой системы, например HKLM: . The same technique works on Windows PowerShell drives that are not file system drives, such as HKLM: . В реестре в качестве расположения можно задать раздел HKLM\Software путем ввода следующего кода: You can set your location to the HKLM\Software key in the registry by typing:
После этого можно изменить расположение каталога на родительский каталог, который является корнем диска Windows PowerShell HKLM: с помощью относительного пути: You can then change the directory location to the parent directory, which is the root of the Windows PowerShell HKLM: drive, by using a relative path:
Вы можете ввести Set-Location или использовать любой из встроенных псевдонимов Windows PowerShell для Set-Location (cd, chdir, sl). You can type Set-Location or use any of the built-in Windows PowerShell aliases for Set-Location (cd, chdir, sl). Пример: For example:
Сохранение и отзыв последних расположений (Push-Location и Pop-Location) Saving and Recalling Recent Locations (Push-Location and Pop-Location)
При изменении расположения полезно отслеживать свое предыдущее расположение и иметь возможность вернуться к нему. When changing locations, it is helpful to keep track of where you have been and to be able to return to your previous location. Командлет Push-Location в Windows PowerShell создает упорядоченный журнал («стек») путей к каталогам, которые вы открывали, чтобы можно было вернуться на шаг назад по журналу путей к каталогу, используя дополнительный командлет Pop-Location . The Push-Location cmdlet in Windows PowerShell creates a ordered history (a «stack») of directory paths where you have been, and you can step back through the history of directory paths by using the complementary Pop-Location cmdlet.
Например, Windows PowerShell обычно запускается в корневом каталоге пользователя. For example, Windows PowerShell typically starts in the user’s home directory.
Слово стек имеет специальное значение во многих параметрах программирования, включая .NET Framework. The word stack has a special meaning in many programming settings, including .NET Framework. Например, в физическом стеке элементов последний элемент, помещенный в стек, является первым элементом, который можно извлечь из него. Like a physical stack of items, the last item you put onto the stack is the first item that you can pull off the stack. Добавление элемента в стек в разговорной речи называется «проталкиванием» элемента в стек. Adding an item to a stack is colloquially known as «pushing» the item onto the stack. Извлечение элемента из стека в разговорной речи называется «выводом» элемента из стека. Pulling an item off the stack is colloquially known as «popping» the item off the stack.
Чтобы передать текущее расположение в стек, а затем переместить его в папку локальных параметров, введите: To push the current location onto the stack, and then move to the Local Settings folder, type:
После этого можно передать расположение локальных параметров в стек и переместить его в папку Temp, введя следующее: You can then push the Local Settings location onto the stack and move to the Temp folder by typing:
Чтобы убедиться, что каталоги изменены, введите команду Get-Location : You can verify that you changed directories by entering the Get-Location command:
После этого можно перейти в последний открытый каталог, введя команду Pop-Location , и проверить изменение, введя команду Get-Location : You can then pop back into the most recently visited directory by entering the Pop-Location command, and verify the change by entering the Get-Location command:
Как и в случае с командлетом Set-Location , можно включить параметр -PassThru при вводе командлета Pop-Location , чтобы открыть указанный каталог: Just as with the Set-Location cmdlet, you can include the -PassThru parameter when you enter the Pop-Location cmdlet to display the directory that you entered:
Кроме того, можно использовать командлеты расположения с сетевыми путями. You can also use the Location cmdlets with network paths. Если у вас есть сервер FS01 с общей папкой Public, можно изменить расположение, введя If you have a server named FS01 with an share named Public, you can change your location by typing
Для изменения расположения на любой доступный диск можно использовать команды Push-Location и Set-Location . You can use the Push-Location and Set-Location commands to change the location to any available drive. Например, если у вас есть локальный дисковод компакт-дисков с буквой диска D, содержащий компакт-диск с данными, вы можете изменить расположение на дисковод компакт-дисков, введя команду Set-Location D: . For example, if you have a local CD-ROM drive with drive letter D that contains a data CD, you can change the location to the CD drive by entering the Set-Location D: command.
Если дисковод пуст, вы получите следующее сообщение об ошибке: If the drive is empty, you will get the following error message:
В интерфейсе командной строки проводник неудобно использовать для просмотра свободных физических дисков. When you are using a command-line interface, it is not convenient to use File Explorer to examine the available physical drives. Также в проводнике будут показаны не все диски PowerShell. Also, File Explorer would not show you the all of the Windows PowerShell drives. Windows PowerShell предоставляет набор команд для управления дисками Windows PowerShell, о которых речь пойдет далее. Windows PowerShell provides a set of commands for manipulating Windows PowerShell drives, and we will talk about these next.
Get Parent directory of a specific path in batch script
Hi I have full file path in a variable of batch file. How to get its first and second level parent directory path?
dppath% work? I know it works for numbered args (%
dp1). – Andy Nugent Jan 22 ’16 at 9:09
3 Answers 3
do not use variable PATH for this. %PATH% is a built-in variable used by the command prompt.
dpa» ; you are removing the trailing backslash, which might be problematic in case the first-level parent is already the root of a drive, because the loop would receive e. g. D: , which means the current directory of drive D: ; my suggestion returns the root of drive D: . – aschipfl Jan 22 ’16 at 14:01
As npocmaka correctly suggests, pick a different variable from %PATH% (or any of these other environment variables). Secondly, make sure your script uses setlocal to avoid junking up your console session’s environment with the variables in this script. Thirdly, just add a \.. for each ancestor you want to navigate. No need to bother with substring manipulation.
0,-1% – mwag Oct 3 ’20 at 14:35
It is possible to get the file first parent (base dir) using a small subroutine that returns a
dp path to a file, :GetFileBaseDir and :GetFileBaseDirWithoutEndSlash in the example below.
Thank to @rojo for a way to achive the goal for multiple parents. I’ve enveloped his solution in a subroutine :GetDirParentN to make it more useful.