2013-04-05 37 views
5

Tôi đã có một mẹo vặt trong Windows cmd.exe (ít nhất lên đến XP) để mô phỏng hành vi của UNIX echo mà không có dòng mới, echo -n. Ví dụ: lệnh:Tương đương với Windows của "echo -n" không còn hoạt động trong Win7

<nul: set /p junk= xyzzy 

sẽ cho kết quả chính xác sáu ký tự là đầu ra, không gian hàng đầu và chuỗi "xyzzy" và không có gì khác.

Nếu bạn quan tâm đến lý do tại sao công trình này, nó thực sự là một lệnh đầu vào mà kết quả đầu ra " xyzzy" như dấu nhắc sau đó chờ đợi cho người dùng nhập vào trước khi gán đầu vào đó để biến junk môi trường. Trong trường hợp đặc biệt này, nó không đợi đầu vào của người dùng vì nó lấy đầu vào từ thiết bị nul.

Nó khá hữu ích trong các tập lệnh cmd khi (ví dụ) xử lý tệp trong một vòng lặp (một lần lặp cho mỗi tệp) mà bạn muốn liệt kê nhiều hơn một dòng. Bằng cách sử dụng thủ thuật này, bạn có thể chỉ đơn giản là sản lượng mỗi tên tập tin sau đó là một không gian và không xuống dòng sau đó, sau khi vòng lặp, đầu ra một dòng mới để kết thúc:

Processing files: 
    file1.txt file42.txt p0rn.zip 

Bây giờ tôi khám phá ra rằng, hệ điều hành Windows 7, những không gian không còn đầu ra vì vậy những gì tôi nhận được là:

Processing files: 
file1.txtfile42.txtp0rn.zip 

có cách nào tôi có thể nhận set /p để bắt đầu tôn vinh không gian của tôi một lần nữa, hoặc là có một cách khác trong Win7 để đạt được hiệu quả tương tự?

tôi đã cố gắng trích dẫn, sử dụng . (mà làm việc trong echo) và thậm chí thoát chuỗi với ^, nhưng không ai trong số họ có vẻ làm việc:

C:\Pax> <nul: set /p junk= xyzzy 
xyzzy 

C:\Pax> <nul: set /p junk=" xyzzy" 
xyzzy 

C:\Pax> <nul: set /p junk=' xyzzy' 
' xyzzy' 

C:\Pax> <nul: set /p junk=. xyzzy 
. xyzzy 

C:\Pax> <nul: set /p junk=^ xyzzy 
xyzzy 

Những gì tôi cần là:

C:\Pax> some_magical_command_with_an_argument xyzzy 
xyzzy 

sẽ cho tôi (các) khoảng trống ở đầu không có dòng mới ở cuối.

+2

+1 để thử thực sự khó làm việc trong tệp hàng loạt mà bất kỳ người SANE nào sẽ làm trong PERL hoặc PYTHON. –

+0

@Warren, rất tiếc chính sách ra lệnh chúng tôi chỉ có thể sử dụng những gì có sẵn trên bản cài đặt Win cơ bản. Vì vậy, Perl và Python là ra, mặc dù thực tế tôi có thể có thể làm điều đó trong một nửa dòng mã :-) Tôi _could_ viết lại các kịch bản trong VBScript nhưng tôi hy vọng cho một sửa chữa dễ dàng hơn - các kịch bản không phải là nhỏ. Có nói rằng, tôi có thể có thể chỉ làm bit lặp lại trong VBS vì vậy tôi có thể nhìn vào đó. Nếu bạn đặt câu trả lời đó vào một câu trả lời, tôi sẽ +1 bạn, vì đó là nhận xét của bạn về việc sử dụng một ngôn ngữ phong nha khiến tôi suy nghĩ theo cách đó. – paxdiablo

+0

Vì vậy, công ty của bạn không cho phép mọi người cài đặt phần mềm bằng trình cài đặt? :-) –

Trả lời

0

Đây không phải là sử dụng set hoặc khác cmd -ngoài nội dung, nhưng bạn có thể sử dụng cscript (cũng được bao gồm trong cài đặt Windows chuẩn) để thực hiện tương tự. Bạn thậm chí có thể tự điều khiển nó từ chính tệp cmd (không có tệp riêng để duy trì) bằng cách tạo các tệp vbs tạm thời.

Nơi mã này trong tập tin cmd của bạn:

rem Create the VBS file to output spaces and a word. 

echo.for i = 1 to WScript.Arguments.Item(0) >spacetext.vbs 
echo.  WScript.StdOut.Write ^" ^" >>spacetext.vbs 
echo.next >>spacetext.vbs 
echo.WScript.StdOut.Write WScript.Arguments.Item(1) >>spacetext.vbs 

rem Do this once per word you want output (eg, in a loop). 

cscript /nologo spacetext.vbs 0 Hello, 
cscript /nologo spacetext.vbs 1 my 
cscript /nologo spacetext.vbs 1 name 
cscript /nologo spacetext.vbs 1 is 
cscript /nologo spacetext.vbs 4 Pax. 

rem Do this at the end to add newline and kill temp file. 

echo. 
del spacetext.vbs 

Kết quả của việc này là những gì bạn sẽ mong đợi:

Hello, my name is Pax. 
0

OK, có câu trả lời ngay bây giờ: bạn có thể không có một hàng đầu <space> trong Win7 với set /p.Có sự khác biệt giữa các phiên bản Windows:

Syntax    | XP         | Vista and Windows 7 
----------------------+-------------------------------------+------------------------------------- 
<nul set /p =!msg! |- If 1st char is quote, then trims |- Trims leading white space chars. 
     or    | that quote, and if at least one |- If 1st non white space char is  
<nul set /p "=!msg!" | additional quote, than trims last | quote, then that quote is treated 
         | quote and all remaining chars.  | as white space and trimmed, and if 
         |- If 1st non trimmed char is =, then | at least one additional quote, then 
         | syntax error.      | trims last quote and all remaining 
         |          | chars. 
         |          |- If 1st non trimmed char is =, then 
         |          | syntax error. 
----------------------+-------------------------------------+------------------------------------- 
<nul set /p ="!msg!" |- Trims leading control chars and |- Trims leading white space chars. 
     or    | spaces.       |- If 1st non trimmed char is =, then 
<nul set /p "="!msg!""|- If 1st non trimmed char is =, then | syntax error. 
         | syntax error.      | 
----------------------+-------------------------------------+------------------------------------- 

On Vista and Windows 7, the trimmed leading white space chars are: 
    9 0x09 Horizontal Tab 
    10 0x0A New Line 
    11 0x0B Vertical Tab 
    12 0x0C Form Feed 
    13 0x0D Carriage Return 
    32 0x20 Space 
    255 0xFF Non-breaking Space 

source

Đối với một kỹ thuật khác để có được không gian hàng đầu trong hàng loạt tinh khiết thấy here

0

Bạn có nghĩa là như thế này?

@ECHO OFF 
SETLOCAL 
FOR /l %%i IN (1,1,4) DO <NUL SET /p var="item %%i " 

Kết quả:

mục 1 mục 2 mục 3 mục 4

Hay bạn hoàn toàn nhấn mạnh vào một không gian lúc bắt đầu?

1

Điều này rất giống với câu trả lời của paxdiablo, ngoại trừ tôi sử dụng tệp JScript/batch lai thay vì tệp VBScript tạm thời.

Tập lệnh của tôi được gọi là jEval.bat - và nó chỉ đơn giản là đánh giá bất kỳ biểu thức JScript hợp lệ nào và ghi kết quả vào stdout, tùy chọn với một dòng mới. Kịch bản nhỏ ngớ ngẩn cực kỳ hữu ích cho việc lập trình theo lô.

Giả sử jEval.bat hoặc là trong thư mục hiện tại của bạn, hoặc nơi nào đó trong PATH của bạn, sau đó bạn có thể chỉ cần làm một cái gì đó như:

call jeval "' xyzzy'" 

Đây là kịch bản. Nó thực sự rất đơn giản. Hầu hết mã có liên quan đến tài liệu, xử lý lỗi và hệ thống trợ giúp được tích hợp sẵn.

@if (@X)==(@Y) @end /* harmless hybrid line that begins a JScrpt comment 

::************ Documentation *********** 
::: 
:::jEval JScriptExpression [/N] 
:::jEval /? 
::: 
::: Evaluates a JScript expression and writes the result to stdout. 
::: 
::: A newline (CR/LF) is not appended to the result unless the /N 
::: option is used. 
::: 
::: The JScript expression should be enclosed in double quotes. 
::: 
::: JScript string literals within the expression should be enclosed 
::: in single quotes. 
::: 
::: Example: 
::: 
::: call jEval "'5/4 = ' + 5/4" 
::: 
::: Output: 
::: 
::: 5/4 = 1.25 
::: 

::************ Batch portion *********** 
@echo off 

if "%~1" equ "" (
    call :err "Insufficient arguments" 
    exit /b 
) 
if "%~2" neq "" if /i "%~2" neq "/N" (
    call :err "Invalid option" 
    exit /b 
) 
if "%~1" equ "/?" (
    setlocal enableDelayedExpansion 
    for /f "delims=" %%A in ('findstr "^:::" "%~f0"') do (
    set "ln=%%A" 
    echo(!ln:~3! 
) 
    exit /b 
) 
cscript //E:JScript //nologo "%~f0" %* 
exit /b 

:err 
>&2 echo ERROR: %~1. Use jeval /? to get help. 
exit /b 1 


************ JScript portion ***********/ 
if (WScript.Arguments.Named.Exists("n")) { 
    WScript.StdOut.WriteLine(eval(WScript.Arguments.Unnamed(0))); 
} else { 
    WScript.StdOut.Write(eval(WScript.Arguments.Unnamed(0))); 
} 
Các vấn đề liên quan