Используя два или более set / p в одной строке - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь создать скрипт, который должен заполнить 3 пробела в одной строке.Возможно ли это?

Например, заполнение даты: 25/02/2019 таким образом: day here / month here / year here

Не построчно.

Обычный способ таков:

set /p "dd=Type the Day: "
set /p "mm=Type the Month: %dd% / "
set /p "aa=Type The Year: %dd% / %mm% / "

И результат будет: 22/05/2019

Но я хочу поместить эти 3 set /p в одну строку, заполняя только эту строку.

Iпробовал так:

set dd=%%a
set mm=%%b
set aa=%%c

set /p "test= "!dd! !mm! !aa!
echo %%a / %%b / %%c
pause

тоже пробовал:

set /p "dd=Type the day: " / &set /p "mm=Type the month " &set /p "aa=Type the year "

но, к сожалению, не сработало.Второй способ работал построчно.


Редактировать 1:

Следуйте моему последнему сценарию, чтобы изменить дату Windows с помощью пакетной команды:

@echo off
setlocal enableextensions
setlocal EnableDelayedExpansion
cd /d "%~dp0"
mode 42,12

:begin
cls
echo ------------------------------------------
echo          MUDAR A DATA DO WINDOWS
echo ------------------------------------------
echo( &echo(
echo  1 - Escolher a data & echo( &echo  2 - Retornar para a data atual
echo( & echo( &echo(
choice /n /c:12 /m "Digite uma op‡Æo:"%1
call :lab%errorlevel%


:lab 1
cls
for /F %%a in ('echo prompt $H ^| cmd') do set "BS=%%a"
for /F %%a in ('copy /Z "%~F0" NUL') do set "CR=%%a"
set /P "=Digite a data:     /    /     !CR!Digite a data:  " < nul

call :GetDigits 2 3 Day=
set /P "=.%BS% / " < nul
call :GetDigits 2 1 Mon=
set /P "=.%BS% / " < nul
call :GetDigits 4 2 Year=
echo/
echo/

    net stop w32time >nul 2>nul
    sc config w32time start= disabled >nul 2>nul
    date %Day%-%Mon%-%Year% <nul && (  
    echo Data modificada: %Day%/%Mon%/%Year%
    timeout /nobreak /t 2 >nul 2>nul
    goto begin
) || (
      cls & echo Erro ao mudar a data.
      echo( &echo( &echo(
      pause
      goto begin
)

:GetDigits HowMany FirstLimit Result=
setlocal EnableDelayedExpansion
set "digits=123456789"
set "%3="
choice /C "0!digits:~0,%2!" /N > nul
set /A digit=%errorlevel%-1
set /P "=%digit%" < nul
set "%3=!%3!%digit%"
for /L %%i in (2,1,%1) do (
   choice /C "0%digits%" /N > nul
   set /A digit=!errorlevel!-1
   set /P "=!digit!" < nul
   set "%3=!%3!!digit!"
)

for %%a in (!%3!) do endlocal & set "%3=%%a"
exit /B

:lab2
 sc config w32time start= demand >nul
 net start w32time >nul 2>nul
 cls & w32tm /resync >nul 2>&1
 echo Data atual retornada.
 timeout /nobreak /t 2 >nul 2>nul
 cls & goto begin

Ответы [ 4 ]

2 голосов
/ 23 мая 2019

Комментариев нет ... ;)

@echo off
setlocal EnableDelayedExpansion

for /F %%a in ('echo prompt $H ^| cmd') do set "BS=%%a"
for /F %%a in ('copy /Z "%~F0" NUL') do set "CR=%%a"
set /P "=Enter the date:  DD / MM / YYYY!CR!Enter the date:  " < nul

call :GetDigits 2 3 Day=
set /P "=.%BS% / " < nul
call :GetDigits 2 1 Mon=
set /P "=.%BS% / " < nul
call :GetDigits 4 2 Year=
echo/
echo/
echo Result: %Day%/%Mon%/%Year%
goto :EOF


:GetDigits HowMany FirstLimit Result=
setlocal EnableDelayedExpansion
set "digits=123456789"
set "%3="
choice /C "0!digits:~0,%2!" /N > nul
set /A digit=%errorlevel%-1
set /P "=%digit%" < nul
set "%3=!%3!%digit%"
for /L %%i in (2,1,%1) do (
   choice /C "0%digits%" /N > nul
   set /A digit=!errorlevel!-1
   set /P "=!digit!" < nul
   set "%3=!%3!!digit!"
)

for %%a in (!%3!) do endlocal & set "%3=%%a"
exit /B
0 голосов
/ 23 мая 2019

Если система является поддерживаемой платформой Windows, PowerShell может быть вызван из сценария файла .bat для представления календаря графического интерфейса пользователя для выбора даты.Поместите скрипт .ps1 в тот же каталог, что и скрипт .bat.Адаптировано из https://docs.microsoft.com/en-us/powershell/scripting/samples/creating-a-graphical-date-picker?view=powershell-6

=== guical.bat

set "THEDATE="
for /f "delims=" %%d in ('powershell -NoLogo -NoProfile -File "%~dp0guical.ps1"') do (
    set "THEDATE=%%~d"
)

if "%THEDATE%" == "" (
    echo No date selected.
) else (
    echo Selected date is %THEDATE%
)

=== guical.ps1

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$form = New-Object Windows.Forms.Form -Property @{
    StartPosition = [Windows.Forms.FormStartPosition]::CenterScreen
    Size          = New-Object Drawing.Size 233, 270
    Text          = 'Select a Date'
    Topmost       = $true
}

$calendar = New-Object Windows.Forms.MonthCalendar -Property @{
    ShowTodayCircle   = $false
    MaxSelectionCount = 1
}
$form.Controls.Add($calendar)

$OKButton = New-Object Windows.Forms.Button -Property @{
    Location     = New-Object Drawing.Point 38, 200
    Size         = New-Object Drawing.Size 75, 23
    Text         = 'OK'
    DialogResult = [Windows.Forms.DialogResult]::OK
}
$form.AcceptButton = $OKButton
$form.Controls.Add($OKButton)

$CancelButton = New-Object Windows.Forms.Button -Property @{
    Location     = New-Object Drawing.Point 113, 200
    Size         = New-Object Drawing.Size 75, 23
    Text         = 'Cancel'
    DialogResult = [Windows.Forms.DialogResult]::Cancel
}
$form.CancelButton = $CancelButton
$form.Controls.Add($CancelButton)

$result = $form.ShowDialog()

if ($result -eq [Windows.Forms.DialogResult]::OK) {
    $date = $calendar.SelectionStart
    Write-Host "$($date.ToString('MM\/dd\/yyyy'))"
}
0 голосов
/ 23 мая 2019

Вы также можете использовать непосредственно из цикла в вашем , если это лучше соответствует вашим целям:

Нечто подобное может быть адекватным;конечному пользователю предлагается ввести дату в определенном формате, и он продолжается только тогда, когда PowerShell распознает ввод в качестве действительной даты:

@Echo Off
Set "Input="
For /F "Tokens=*" %%A In ('PowerShell -NoP^
 "$d=$Null;While(1){Try{$d=[DateTime](Read-Host 'Date [dd/MM/yyyy]')"^
 ";Break}Catch{}};$d.ToString('dd/MM/yyyy')" 2^>Nul')Do Set "Input=%%A"
Set Input 2>Nul&Pause
0 голосов
/ 23 мая 2019

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

@echo off

choice /c "1234567890" /m "__/__/__" /n
set x1=%errorlevel%
if errorlevel 10 set x1=0

cls
choice /c "1234567890" /m "%x1%_/__/__" /n
set x2=%errorlevel%
if errorlevel 10 set x2=0

cls
choice /c "1234567890" /m "%x1%%x2%/__/__" /n
set x3=%errorlevel%
if errorlevel 10 set x3=0

cls
choice /c "1234567890" /m "%x1%%x2%/%x3%_/__" /n
set x4=%errorlevel%
if errorlevel 10 set x4=0

cls
choice /c "1234567890" /m "%x1%%x2%/%x3%%x4%/__" /n
set x5=%errorlevel%
if errorlevel 10 set x5=0

cls
choice /c "1234567890" /m "%x1%%x2%/%x3%%x4%/%x5%_" /n
set x6=%errorlevel%
if errorlevel 10 set x6=0

cls
echo Date - %x1%%x2%/%x3%%x4%/%x5%%x6%
pause>nul
...