كيف يمكنني الحصول على نتيجة القيادة في متغير في ويندوز ؟

StackOverflow https://stackoverflow.com/questions/108439

  •  01-07-2019
  •  | 
  •  

سؤال

أنا أتطلع للحصول على نتيجة الأمر متغير في ويندوز دفعة النصي (انظر كيفية الحصول على نتيجة القيادة في باش لباش البرمجة ما يعادلها).الحل الذي سوف تعمل في .bat المفضل, ولكن الشائعة الأخرى windows scripting الحلول هي أيضا موضع ترحيب.

هل كانت مفيدة؟

المحلول

إذا كان لديك لالتقاط جميع إخراج الأمر يمكنك استخدام دفعة من هذا القبيل:

@ECHO OFF
IF NOT "%1"=="" GOTO ADDV
SET VAR=
FOR /F %%I IN ('DIR *.TXT /B /O:D') DO CALL %0 %%I
SET VAR
GOTO END

:ADDV
SET VAR=%VAR%!%1

:END

جميع خطوط الانتاج يتم تخزينها في فار مفصولة "!".

@جون:هل هناك أي فائدة عملية من أجل هذا ؟ أعتقد أن عليك أن تنتبه PowerShell أو أي لغة برمجة أخرى قادرة على أداء البرمجة المهام بسهولة (Python, Perl, PHP, Ruby)

نصائح أخرى

المتواضع بالنسبة الأوامر التي تراكمت لديها بعض القدرات على مر السنين:

D:\> FOR /F "delims=" %i IN ('date /t') DO set today=%i
D:\> echo %today%
Sat 20/09/2008

علما بأن "delims=" الكتابة الافتراضي مساحة التبويب المحددات بحيث خرج من تاريخ الأمر يحصل استحوذت في كل مرة.

التقاط متعدد خط الانتاج, لا يزال يمكن أن تكون أساسا واحدة بطانة (باستخدام متغير لو كمحدد في الناتج متغير):

REM NB:in a batch file, need to use %%i not %i
setlocal EnableDelayedExpansion
SET lf=-
FOR /F "delims=" %%i IN ('dir \ /b') DO if ("!out!"=="") (set out=%%i) else (set out=!out!%lf%%%i)
ECHO %out%

التقاط الأنابيب التعبير ، استخدام ^|:

FOR /F "delims=" %%i IN ('svn info . ^| findstr "Root:"') DO set "URL=%%i"

للحصول على الدليل الحالي, يمكنك استخدام هذا:

CD > tmpFile
SET /p myvar= < tmpFile
DEL tmpFile
echo test: %myvar%

كما temp الملف على الرغم من ذلك فإنه ليس جميلا ولكنه يعمل بالتأكيد!'CD' يضع الدليل الحالي في 'tmpFile', 'SET' الأحمال محتوى tmpFile.

هنا هو الحل خطوط متعددة مع "الصفيف":

@echo off

rem ---------
rem Obtain line numbers from the file
rem ---------

rem This is the file that is being read: You can replace this with %1 for dynamic behaviour or replace it with some command like the first example i gave with the 'CD' command.
set _readfile=test.txt

for /f "usebackq tokens=2 delims=:" %%a in (`find /c /v "" %_readfile%`) do set _max=%%a
set /a _max+=1
set _i=0
set _filename=temp.dat

rem ---------
rem Make the list
rem ---------

:makeList
find /n /v "" %_readfile% >%_filename%

rem ---------
rem Read the list
rem ---------

:readList
if %_i%==%_max% goto printList

rem ---------
rem Read the lines into the array
rem ---------
for /f "usebackq delims=] tokens=2" %%a in (`findstr /r "\[%_i%]" %_filename%`) do set _data%_i%=%%a
set /a _i+=1
goto readList

:printList
del %_filename%
set _i=1
:printMore
if %_i%==%_max% goto finished
set _data%_i%
set /a _i+=1
goto printMore

:finished

ولكن قد ترغب في النظر في الانتقال إلى آخر أكثر قوة قذيفة أو إنشاء تطبيق على هذه الأشياء.انها تمتد إمكانيات الملفات الدفعية قليلا جدا.

تحتاج إلى استخدام SET الأمر مع المعلمة /P و توجيه الإخراج إلى ذلك.انظر على سبيل المثال http://www.ss64.com/nt/set.html.سوف تعمل من أجل CMD, غير متأكدة .BAT

من تعليق على هذا المنصب:

هذا الرابط يحتوي على الأوامر "Set /P _MyVar=<MyFilename.txt"التي تقول انها سوف تحدد _MyVar إلى السطر الأول من MyFilename.txt.هذا يمكن أن يكون يستخدم "myCmd > tmp.txt"مع "set /P myVar=<tmp.txt".ولكن سيتم فقط الحصول على أول خط الانتاج ، لا كل الانتاج

على سبيل المثال في "V" متغير البيئة أحدث ملف

FOR /F %I IN ('DIR *.* /O:D /B') DO SET V=%I

في ملف دفعي لديك لاستخدام مزدوج البادئة في حلقة متغير:

FOR /F %%I IN ('DIR *.* /O:D /B') DO SET V=%%I

فقط استخدام النتيجة من FOR الأوامر.على سبيل المثال (داخل الملف الدفعي):

for /F "delims=" %%I in ('dir /b /a-d /od FILESA*') do (echo %%I)

يمكنك استخدام %%I كما القيمة التي تريدها.تماما مثل هذا: %%I.

و مقدما %%I لا يحتوي على أية مسافات أو أحرف CR و يمكن استخدام المقارنات!!

إذا كنت تبحث عن الحل في المقدمة باستخدام نتيجة الأمر كحجة في باش ؟

ثم هنا هو رمز:

@echo off
if not "%1"=="" goto get_basename_pwd
for /f "delims=X" %%i in ('cd') do call %0 %%i
for /f "delims=X" %%i in ('dir /o:d /b') do echo %%i>>%filename%.txt
goto end

:get_basename_pwd
set filename=%~n1

:end
  • هذا سوف تسمي نفسها مع نتيجة الأمر CD, نفس الأشخاص ذوي الإعاقة.
  • سلسلة استخراج على المعلمات سيعود اسم الملف/المجلد.
  • الحصول على محتويات هذا المجلد و إلحاق filename.txt

[مشرفون]:شكرا على جميع الردود و بعض الحفر على ويندوز XP الأوامر الصفحة.

@echo off

ver | find "6.1." > nul
if %ERRORLEVEL% == 0 (
echo Win7
for /f "delims=" %%a in ('DIR "C:\Program Files\Microsoft Office\*Outlook.EXE" /B /P /S') do call set findoutlook=%%a
%findoutlook%
)

ver | find "5.1." > nul
if %ERRORLEVEL% == 0 (
echo WinXP
for /f "delims=" %%a in ('DIR "C:\Program Files\Microsoft Office\*Outlook.EXE" /B /P /S') do call set findoutlook=%%a
%findoutlook%
)
echo Outlook dir:  %findoutlook%
"%findoutlook%"

أود أن أضيف ملاحظة أن الحلول المذكورة أعلاه:

كل هذه جمل تعمل بشكل جيد تماما إذا كان الأمر وجدت داخل المسار أو إذا كان الأمر هو cmdpath بدون مسافات أو أحرف خاصة.

ولكن إذا كنت في محاولة استخدام أمر قابل للتنفيذ يقع في مجلد المسار الذي يحتوي على أحرف خاصة إذا كنت بحاجة إلى أرفق بك الأمر المسار في علامات اقتباس مزدوجة (") ثم FOR /F الجملة لا يعمل.

أمثلة:

$ for /f "tokens=* USEBACKQ" %f in (
    `""F:\GLW7\Distrib\System\Shells and scripting\f2ko.de\folderbrowse.exe"" Hello '"F:\GLW7\Distrib\System\Shells and scripting"'`
) do echo %f
The filename, directory name, or volume label syntax is incorrect.

أو

$ for /f "tokens=* USEBACKQ" %f in (
      `"F:\GLW7\Distrib\System\Shells and scripting\f2ko.de\folderbrowse.exe" "Hello World" "F:\GLW7\Distrib\System\Shells and scripting"`
) do echo %f
'F:\GLW7\Distrib\System\Shells' is not recognized as an internal or external command, operable program or batch file.

أو

`$ for /f "tokens=* USEBACKQ" %f in (
     `""F:\GLW7\Distrib\System\Shells and scripting\f2ko.de\folderbrowse.exe"" "Hello World" "F:\GLW7\Distrib\System\Shells and scripting"`
) do echo %f
'"F:\GLW7\Distrib\System\Shells and scripting\f2ko.de\folderbrowse.exe"" "Hello' is not recognized as an internal or external command, operable program or batch file.

في هذه الحالة الحل الوحيد لقد وجدت أن استخدام الأوامر و تخزين النتيجة في المتغير هو (مؤقتا) الدليل الافتراضي إلى واحد من الأوامر نفسها :

pushd "%~d0%~p0"
FOR /F "tokens=* USEBACKQ" %%F IN (
    `FOLDERBROWSE "Hello world!" "F:\GLW7\Distrib\System\Layouts (print,display...)"`
) DO (SET MyFolder=%%F)
popd
echo My selected folder: %MyFolder%

ثم النتيجة الصحيحة:

My selected folder: F:\GLW7\Distrib\System\OS install, recovery, VM\
Press any key to continue . . .

طبعا في المثال أعلاه ، أعتقد أن بلدي دفعة البرنامج النصي الموجود في نفس المجلد مثل أحد الأوامر القابلة للتنفيذ بحيث لا يمكن استخدام "%~d0%~p0" بناء الجملة.إذا لم تكن هذه هي الحالة ، ثم عليك أن تجد وسيلة لتحديد مسار الأمر و تغيير الدليل الافتراضي إلى طريقها.

ملحوظة::بالنسبة لأولئك الذين يتساءلون العينة الأوامر المستخدمة هنا (لتحديد مجلد) ، FOLDERBROWSE.EXE.وجدته على موقع ويب f2ko.de (http://f2ko.de/en/cmd.php).

إذا كان أي شخص لديه حل أفضل لهذا النوع من الأوامر يمكن الوصول إليها من خلال مسار معقد, وسوف نكون سعداء جدا لسماع ذلك.

جيل

يمكنك التقاط كل الناتج في متغير واحد ، ولكن الخطوط سوف تكون مفصولة حرف من اختيارك (# في المثال أدناه) بدلا من الفعلي LF CR.

@echo off
setlocal EnableDelayedExpansion
for /f "delims=" %%i in ('dir /b') do (
    if "!DIR!"=="" (set DIR=%%i) else (set DIR=!DIR!#%%i)
)
echo directory contains:
echo %DIR%

النسخة الثانية, إذا كنت بحاجة إلى طباعة محتويات خارج خط سطرا.هذا يأخذ advanted من حقيقة أنه لن يكون هناك تكرار خطوط الانتاج من "dir /b", لذلك قد لا تعمل في الحالة العامة.

@echo off
setlocal EnableDelayedExpansion
set count=0
for /f "delims=" %%i in ('dir /b') do (
    if "!DIR!"=="" (set DIR=%%i) else (set DIR=!DIR!#%%i)
    set /a count = !count! + 1
)

echo directory contains:
echo %DIR%

for /l %%c in (1,1,%count%) do (
    for /f "delims=#" %%i in ("!DIR!") do (
        echo %%i
        set DIR=!DIR:%%i=!
    )
)
@echo off
setlocal EnableDelayedExpansion
FOR /F "tokens=1 delims= " %%i IN ('echo hola') DO (
    set TXT=%%i
)
echo 'TXT: %TXT%'

والنتيجة هي 'TXT:حولا'

يجب عليك استخدام for الأمر هنا مثال:

@echo off
rem Commands go here
exit /b
:output
for /f "tokens=* useback" %%a in (`%~1`) do set "output=%%a"

ويمكنك استخدام call :output "Command goes here" ثم سوف يكون الإخراج في %output% متغير.

ملاحظة: إذا كان لديك أمر الإخراج الذي هو متعدد ، هذه الأداة سوف set الإخراج إلى السطر الأخير من متعدد الأمر.

يرجى الرجوع إلى هذا http://technet.microsoft.com/en-us/library/bb490982.aspx وهو ما يفسر ما يمكنك القيام به مع إخراج الأمر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top