2013-05-02 11 views
5

Próbuję uzyskać plik zapisywania oparty na gui jako okno dialogowe z poziomu skryptu wsadowego Windows. Chciałbym mieć nowy przycisk folderu po lewej stronie przycisku anulowania zapisu &. Bez predefiniowanego rodzaju pliku. Więc prawdopodobnie musiałby być ustawiony na wszystkie pliki.Zapisz okno dialogowe pliku z PowerShell/C# z cmd partii

Coś podobnego do tego: Save Dialog

(Ignore przycisków w lewym górnym rogu)

Znalazłem piękny soloution, z górnego odpowiedzi na otwarcie pliku tutaj: File/folder chooser dialog from a Windows batch script

Byłoby miło mieć podobne soloution dla zapisu jako dialog. Co najważniejsze, chciałbym ustawić ścieżkę do nazwy pliku & na własne zmienne. W celu lub ze względu na przykład. Możemy wstawić "Hello World" jako wynik.

exempli gratia:

echo Hello World > %variable.path%%variable.file% 

Poniższy przykład jest bezpośredni cytat z połączonego postu.

:: chooser.bat 
:: launches a File... Open sort of file chooser and outputs choice to the console 

@echo off 
setlocal enabledelayedexpansion 

:: Does powershell.exe exist within %PATH%? 
for %%I in (powershell.exe) do if "%%~$PATH:I" neq "" (
set chooser=powershell "Add-Type -AssemblyName System.windows.forms|Out-Null;$f=New- Object System.Windows.Forms.OpenFileDialog;$f.InitialDirectory='%cd%';$f.Filter='Text Files  (*.txt)|*.txt|All Files (*.*)|*.*';$f.showHelp=$true;$f.ShowDialog()|Out-Null;$f.FileName" 
) else (
rem :: If not, compose and link C# application to open file browser dialog 
set chooser=%temp%\chooser.exe 
>"%temp%\c.cs" echo using System;using System.Windows.Forms; 
>>"%temp%\c.cs" echo class dummy{ 
>>"%temp%\c.cs" echo public static void Main^(^){ 
>>"%temp%\c.cs" echo OpenFileDialog f=new OpenFileDialog^(^); 
>>"%temp%\c.cs" echo f.InitialDirectory=Environment.CurrentDirectory; 
>>"%temp%\c.cs" echo f.Filter="Text Files (*.txt)|*.txt|All Files (*.*)|*.*"; 
>>"%temp%\c.cs" echo f.ShowHelp=true; 
>>"%temp%\c.cs" echo f.ShowDialog^(^); 
>>"%temp%\c.cs" echo Console.Write^(f.FileName^);}} 
for /f "delims=" %%I in ('dir /b /s "%windir%\microsoft.net\*csc.exe"') do (
    if not exist "!chooser!" "%%I" /nologo /out:"!chooser!" "%temp%\c.cs" 2>NUL 
) 
del "%temp%\c.cs" 
if not exist "!chooser!" (
    echo Error: Please install .NET 2.0 or newer, or install PowerShell. 
    goto :EOF 
) 
) 

:: capture choice to a variable 
for /f "delims=" %%I in ('%chooser%') do set "filename=%%I" 

echo You chose %filename% 

:: Clean up the mess 
del "%temp%\chooser.exe" 2>NUL 
    goto :EOF 

enter image description here

starałem się dostosować powyższy przykład do pracy na Zapisz jako. Ale nie rozumiem tego wystarczająco dobrze, aby to zrobić. Dlatego używam przede wszystkim skryptów wsadowych, a nie lepiej funkcjonującego języka programowania.

Moje zrozumienie powyższego jest takie, że jest to skrypt wsadowy systemu Windows, który wywołuje PowerShell, jeśli istnieje lub PowerShell nie istnieje .net, jeśli istnieje. Będę wtedy używał mojego istniejącego kodu jako alternatywy, jeśli żadna nie istnieje. Alternatywą jest tylko użytkownik wprowadził pełną ścieżkę ręcznie.

echo Set path to file: 
echo Path and file cannot contain any spaces. e.g. c:\folder_name\file.ext 
echo Be sure you include the filename. 
SET /P path1=">"? 
cls 
echo path set to: %path1% 
pause 
cls 
goto :eof 

Prosiłbym o istniejący post. Ale jest to niedozwolone w regułach witryny. Zapytałem więc osobno. Każda pomoc lub wgląd jest mile widziany.

Dziękuję za poświęcony czas: & wysiłek.

Odpowiedz

0

Udało mi się zrobić to samemu. Chociaż bez przycisku chciałem zrobić nowy folder. Kliknięcie prawym klawiszem pociąga za sobą więcej kroków. & Wymusza użycie myszy. Gdzie jako przycisk można zaprogramować do dzwonienia z ALT + N. Niemniej jednak generalnie otrzymałem kod, którego początkowo szukałem.

:: chooser.bat 
:: launches a save file dialog and outputs choice to the console 
@echo off 
setlocal enabledelayedexpansion 

:: Does powershell.exe exist within %PATH%? 
for %%I in (powershell.exe) do if "%%~$PATH:I" neq "" (
    set chooser=powershell "Add-Type -AssemblyName System.windows.forms|Out-Null;$f=New-Object System.Windows.Forms.SaveFileDialog;$f.InitialDirectory='%cd%';$f.Filter='All Files (*.*)|*.*';$f.showHelp=$true;$f.ShowDialog()|Out-Null;$f.FileName" 
) else (
rem :: If not, compose and link C# application to open file browser dialog 
    set chooser=%temp%\chooser.exe 
    >"%temp%\c.cs" echo using System;using System.Windows.Forms; 
    >>"%temp%\c.cs" echo class dummy{ 
    >>"%temp%\c.cs" echo public static void Main^(^){ 
    >>"%temp%\c.cs" echo SaveFileDialog f=new SaveFileDialog^(^); 
    >>"%temp%\c.cs" echo f.InitialDirectory=Environment.CurrentDirectory; 
    >>"%temp%\c.cs" echo f.Filter="All Files (*.*)|*.*"; 
    >>"%temp%\c.cs" echo f.ShowHelp=true; 
    >>"%temp%\c.cs" echo f.ShowDialog^(^); 
    >>"%temp%\c.cs" echo Console.Write^(f.FileName^);}} 
    for /f "delims=" %%I in ('dir /b /s "%windir%\microsoft.net\*csc.exe"') do (
     if not exist "!chooser!" "%%I" /nologo /out:"!chooser!" "%temp%\c.cs" 2>NUL 
    ) 
    del "%temp%\c.cs" 
    if not exist "!chooser!" (
     echo Error: Please install .NET 2.0 or newer, or install PowerShell. 
     goto :EOF 
    ) 
) 

:: capture choice to a variable 
for /f "delims=" %%I in ('%chooser%') do set "filename=%%I" 

echo You chose %filename% 
pause 

:: Clean up the mess 
del "%temp%\chooser.exe" 2>NUL 
goto :EOF 

Save Dialog

+0

Moje rozwiązanie jest krótsze, mam 2 pytania: dlaczego emcapsulate twój kod PowerShell do CMD kod? Dlaczego kompilujesz C# w PowerShellu, gdzie używasz go inline (Add-Type) lub w twoim przypadku po prostu korzystasz z klas .NET bez C#? – JPBlanc

+0

Ma to na celu otwarcie okna dialogowego skryptu wsadowego Windows, pliku .bat. Nie jestem tym, który zmienił pozycję do stanu powershell, a nie partii. Moje wyniki są niemal bezpośrednią kopią kodu, który znalazłem, cytowany tutaj, z połączonego postu. Tak więc dla C# bit. Nie jestem do końca pewny. Ale lubię mieć drugą funkcjonalną alternatywę. – Terus

5

Oto przykład użycia Windows Forms (SaveFileDialog Class).

Rq: Nie potrzebujesz przycisku do tworzenia nowego katalogu, ponieważ możesz kliknąć prawym przyciskiem myszy na panelu plików, aby to zrobić.

Clear-Host 
Add-Type -AssemblyName system.Windows.Forms 
$saveFile = New-Object System.Windows.Forms.SaveFileDialog 

$saveFile.Filter = "All files (*.*)|*.*" 
$saveFile.FilterIndex = 2 
$saveFile.RestoreDirectory = $true 

$rc = $saveFile.ShowDialog() 
if ($rc -eq [System.Windows.Forms.DialogResult]::OK) 
{ 
    $saveFile.FileName 
    [System.Windows.Forms.MessageBox]::Show("You can save $($saveFile.FileName)", "Ok") 
} 

Uważaj, okno komunikatu, kiedy wszystko jest ok, nie pojawia się w systemie Windows.

+0

Dzięki, doceniam to. Jednak już to zrobiłem. Myślę, że wkrótce przejdę do C#.Wydaje się, że partia wymaga prowizorycznej procedury wokół prawie wszystkiego. – Terus

Powiązane problemy