2014-04-29 3 views
2

stdout을 'name'에 특수 문자가있는 파일로 리디렉션 할 때 이상한 동작이 나타났습니다.이상한 stdout 리디렉션 동작

것들은는 내가 발견했습니다

echo.>f,test 텍스트 ,test을 포함, f라는 파일을 생성합니다. ., ;<space>과 동일합니다 (분명히 쉼표는 어떤 문자로 변경됩니다).

echo.>f.:testF~000%HK이라고하는 0 바이트의 파일을 생성합니다. 출력 파일 이름의 첫 번째 문자는 리디렉션 문자와 .: 사이의 리디렉션 '파일 이름'에 해당합니다 (.은 무시됩니다/f....이라는 파일을 만들려고하는 같은 이유로 인해 제거 된 파일은 f이라는 파일을 만듭니다) . '파일 이름'이 변경된 후에 텍스트를 변경하면 나머지는 무엇을 의미하는지 알 수 없습니다. 즉 echo.>f.:nope은 여전히 ​​빈 파일 F~000%HK을 생성합니다.

같은 일의 또 다른 예; echo.>test.:testTEST~4N5이라고하는 0 바이트의 파일을 생성합니다.

배치에서 후자의 예제는 이상한 이름의 빈 파일과 동일한 결과를 생성하지만 이전 예제에서는 빈 줄이 포함 된 f 파일을 생성합니다.

설명/'anomalies'를 추가 하시겠습니까?

+1

첫 번째 것은 간단하며 쉼표는 종결 자로 취급되어 파일 이름이 끝납니다. 대신'echo.> "f, test"를 사용하십시오. 필자는 다른 사례를 재현 할 수는 없지만'file : test'는 [대체 데이터 스트림]에 대한 유효한 경로 이름입니다 (http://msdn.microsoft.com/en-us/library/windows/desktop). /aa364404%28v=vs.85%29.aspx)는'file'이라는 이름의 파일에'test'라고 이름을 붙였습니다. –

+0

내 시스템에서 두 번째 경우는 "시스템이 지정된 경로를 찾을 수 없습니다."라는 메시지가 나타납니다. 필자는 F 드라이브가 없으므로 예상대로입니다. –

+0

세 번째 경우는 예상대로 작동합니다. 즉, 대체 데이터 스트림이있는'test.'라는 빈 파일을 생성합니다. 어떤 OS를 사용하고 있습니까? –

답변

3

, ; = <space> <tab>은 표준 구분 기호이므로 echo.>f,testecho. ,test>f과 동일합니다. 이 경우 배치 배치 파일에서 실제로 발생한 일을 echo으로 확인할 수 있습니다 (리디렉션 전에 echo on로 설정). 리다이렉션 구문은 파일에 대해 첫 번째 인수 만 취하고 명령보다 우선 순위가 높기 때문에 까다로울 수 있습니다. 당신은 echo. >"f,test"echo.>test.:test에 관해서는

과 결과를 변경할 수 있습니다 - 당신이 Alternate data streams로 리디렉션 (. 당신은 ADS를 지원하지 않는 FAT32 또는 NTFS FAT32로하고 다른 무언가를 생성 할 수있다 결과)? 여기 more<test.:test

내가 알고 명령을 다음과 같습니다 dir /r 당신은 당신이 더 많은 명령을 사용할 수있는 ADS의 내용을 볼 ADS.To의 상태를 확인하거나 streams.exe from sysinternals (r 스위치 비스타 이상에서 사용할 수 있습니다) ADS를 읽을 수 있습니다 : FOR /F , FIND , FINDSTR ,MORE , CERTUTIL ,CLIP ,EXPAND , SORT , MOFCOMP , FTP -S , CSCRIPT , WSCRIPT

메모장과 워드 패드는 ADS가있는 파일을 열면 ADS를 삭제합니다.

+1

'echo.> f, test'가'echo와 같습니다. f> test'라면,'test '라는 텍스트를 포함하고있는'f'라는 파일을 얻는 이유는 무엇입니까? NTFS를 사용하고 있습니다. '/ s'는 모든 하위 디렉토리를 보여줍니다. – unclemeat

+0

@unclemeat 네, 맞습니다. 답을 바꾸었다. 그리고 datastreams에 대한 스위치는'/r'입니다. dir help.At를 확인하십시오. 필자는 XP를 사용하고있어서 dir help가 불완전합니다. – npocmaka

+1

'dir/R'입니까? – unclemeat