Запрос на выбор папки и сохранение в качестве переменных - PullRequest
0 голосов
/ 19 июня 2020

Я очень новичок в программировании, но смог создать командный файл, в котором использовались следующие строки, чтобы открыть средство выбора папки и сохранить как переменные (srcfolder и destfolder). Моя проблема с этой настройкой заключается в том, что мы не получаем типичное окно выбора файла, в которое мы можем вставить значение для папки, с которой мы хотим начать. Наши пользователи должны щелкнуть структуру папок на 6 или 7 уровней, чтобы выбрать папки, что в следующем диалоге делает медленный процесс

FolderChooser


set "psCommand="(new-object -COM 'Shell.Application')^
.BrowseForFolder(0,'Please choose the source folder.',0,0).self.path""

for /f "usebackq delims=" %%I in (`powershell %psCommand%`) do set "srcfolder=%%I"

set "psCommand="(new-object -COM 'Shell.Application')^
.BrowseForFolder(0,'Please choose the destination folder.',0,0).self.path""

for /f "usebackq delims=" %%I in (`powershell %psCommand%`) do set "destfolder=%%I"

Мы хотели бы иметь возможность использовать диалог, аналогичный File - Open во многих приложениях Microsoft, но только выберите папку, а затем сохраните ее как две переменные, которые будут доступны для командного файла .

Просто дополнительный контекст : у нас есть команда после этого, которая использует переменные src и dest для преобразования файлов, поэтому convert.exe "srcfolder destfolder" выбирает все файлы в srcfolder папку и удаляет правильно отформатированные файлы в папку destfolder. Это преобразование отлично работает с пакетным файлом, просто нужна помощь с диалогом выбора папки, пожалуйста:)

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

Ответы [ 3 ]

0 голосов
/ 20 июня 2020

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

function Get-FileName($initialDirectory) { 
    # Load windows forms without showing anything in the console
    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null
    # Initialize the dialog form
    $openFileDialog = New-Object System.Windows.Forms.OpenFileDialog
    $openFileDialog.ShowHelp = "true"
    $openFileDialog.initialDirectory = $initialDirectory
    $openFileDialog.filter = "All Files (*.*)|*.*"
    $show = $openFileDialog.ShowDialog()
    If ($show -eq "OK") {
        return $openFileDialog.filename
    }
    else {
        return $null
    }
}

Использование:

$fileName = Get-Filename -initialDirectory "D:\"
0 голосов
/ 20 июня 2020
Вот пример , который использует вместо для диалогового окна «Обзор папки».
0</* :
@Echo Off
SetLocal EnableExtensions
Set "RootAt=C:\Users\Schlief\Desktop\MyTestProject\SubDirectory"
:AskSrc
Set "SrcFolder="
For /F "Delims=" %%G In ('""%__APPDIR__%cscript.exe" //E:JScript //NoLogo "%~f0" "source" "%RootAt%" 2>Nul|Find /V """')Do Set "SrcFolder=%%G"
If Not Defined SrcFolder GoTo AskSrc
:AskDest
Set "DestFolder="
For /F "Delims=" %%G In ('""%__APPDIR__%cscript.exe" //E:JScript //NoLogo "%~f0" "destination" "%RootAt%" 2>Nul|Find /V """')Do Set "DestFolder=%%G"
If Not Defined DestFolder GoTo AskDest
Echo Source: %SrcFolder%, Destination: %DestFolder% & Pause
Exit /B */0;
var Folder=new ActiveXObject('Shell.Application').BrowseForFolder(0,'Select your '+WScript.Arguments(0)+' directory',1,WScript.Arguments(1));
try{new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(Folder.Self.Path)};catch(e){};close();

Чтобы использовать его, просто замените место, в котором вы хотите root диалоговое окно, (строка 4) , и вставьте команду convert.exe в строку 13, вместо демонстрационной строки, которую я использовал .

0 голосов
/ 20 июня 2020

Если вам уже известна родительская папка глубиной 5 или 6 уровней, вы можете установить ее в vRootFolder параметре диалогового окна выбора папки:

(new-object -COM 'Shell.Application').BrowseForFolder(0,'Please choose the source folder.',0,'c:\Program Files\').self.path

Один из компромиссов заключается в том, что ваши пользователи не смогут выбрать родительскую папку vRootFolder в появившемся диалоговом окне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...