2013-05-02 4 views
5

Sto cercando di ottenere un file di salvataggio basato su GUI come finestra di dialogo all'interno di uno script batch di Windows. Mi piacerebbe avere un nuovo pulsante di cartella a sinistra dei pulsanti Annulla &. Senza un tipo di file predefinito. Quindi probabilmente dovrebbe essere impostato su tutti i file.Finestra di dialogo Salva file con PowerShell/C# dal lotto cmd

Qualcosa di simile a questo: Save Dialog

(ignorare i pulsanti in alto a sinistra)

ho trovato un bel soloution, dalla risposta superiore, per l'apertura di un file qui: File/folder chooser dialog from a Windows batch script

Sarebbe bello avere una solitaria simile per una finestra di dialogo salva come. Soprattutto, mi piacerebbe che fosse possibile impostare il percorso con il nome file & nelle proprie variabili. Per lo scopo o il gusto dell'esempio. Potremmo inserire "Hello World" come output.

gratia exempli:

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

L'esempio che segue è una citazione diretta dal post collegato.

:: 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

ho cercato di adattare l'esempio precedente a lavorare per salvare come. Ma non lo capisco abbastanza bene da farlo. È per questo che sto usando script in batch e non un linguaggio di programmazione funzionante in primo luogo.

La mia comprensione di quanto sopra è che si tratta di uno script batch di Windows che richiama PowerShell, se esiste o se PowerShell non esiste .net se esiste. Avrò quindi usare il mio codice esistente come alternativa se nessuno dei due esiste. Alternativa ha solo l'input dell'utente il percorso completo manualmente.

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 

Avrei chiesto sul post esistente. Ma ciò non è consentito nelle regole del sito. Quindi ho chiesto separatamente. Qualsiasi aiuto o intuizione è il benvenuto.

Grazie per il vostro tempo & sforzo.

risposta

0

Sono riuscito a farlo funzionare da solo. Sebbene senza il pulsante che volevo per creare una nuova cartella. Fare clic con il pulsante destro del mouse richiede più passaggi & forzare l'uso del mouse. Dove come il pulsante potrebbe essere programmato per la chiamata con ALT + N. Tuttavia ho fondamentalmente il codice risultante che inizialmente ho cercato.

:: 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

La mia soluzione è più breve, ho 2 domande: perché si incapsula il codice PowerShell nel codice CMD? Perché compili C# in PowerShell dove lo usi inline (Aggiungi-Tipo) o nel tuo caso usi semplicemente le classi .NET senza C#? – JPBlanc

+0

Lo scopo di questo è di aprire una finestra di dialogo in uno script batch di Windows, un file .bat. Non sono io quello che ha cambiato l'intestazione in stato powershell e non in batch. I miei risultati sono quasi una copia diretta del codice che ho trovato, e citato qui, dal post collegato. Quindi per il bit C#. Non sono veramente sicuro. Ma mi piace avere una seconda alternativa funzionale. – Terus

5

Ecco un esempio utilizzando Windows Form (SaveFileDialog Class).

Rq: Non è necessario il pulsante per creare una nuova directory, perché è sufficiente fare clic con il pulsante destro del mouse sul pannello dei file per farlo.

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") 
} 

Fare attenzione, la finestra di messaggio, quando è ok, non viene visualizzata nella parte superiore di Windows.

+0

Grazie, apprezzo. L'ho già fatto funzionare me stesso. Penso che passerò a C# nel prossimo futuro.Batch sembra aver bisogno di un giro di fortuna sul metodo per quasi tutto. – Terus