cygwin의 매개변수를 사용하여 Windows 프로그램 실행

cygwin의 매개변수를 사용하여 Windows 프로그램 실행

cygwin 콘솔에서 Windows 프로그램을 실행하고 싶습니다. 다양한 형식을 시도했지만 올바른 구문을 찾지 못했습니다.

 $ cmd /C "C:\Program Files\sqldeveloper\sqldeveloper\bin\sdcli.exe format input=sentencia.tmp output=sent_formateada.tmp"
    "C:\Program" no se reconoce como un comando interno o externo,
    programa o archivo por lotes ejecutable.

 $ cmd /C "C:\Program Files\sqldeveloper\sqldeveloper\bin\sdcli.exe" format input=sentencia.tmp output=sent_formateada.tmp
        format input=<archivo o directorio de entrada> output=<archivo o directorio de salida>


 $ cmd /C C:\\"Program Files"\\sqldeveloper\\sqldeveloper\\bin\\sdcli.exe format input=o:\\Mezcla\\Scripts\\Oracle\\Informes_HTML\\TMP\\sentencia.tmp output=o:\\Mezcla\\S cripts\\Oracle\\Informes_HTML\\TMP\\sent_formateada.tmp

    Error en input=o:\Mezcla\Scripts\Oracle\Informes_HTML\TMP\sentencia.tmp output=o:\Mezcla\Scripts\Oracle\Informes_HTML\TMP\sent_formateada.tmp
    format input=<archivo o directorio de entrada> output=<archivo o directorio de salida>
    Comando terminado.

답변1

왜 cmd를 호출합니까? 이는 필요하지 않은 추가 수준의 복잡성입니다. Bash에서 직접 Windows 프로그램을 호출할 수 있습니다.

'C:\Program Files\sqldeveloper\sqldeveloper\bin\sdcli.exe' format input=sentencia.tmp output=sent_formateada.tmp

또는

/cygdrive/c/Program\ Files/sqldeveloper/sqldeveloper/bin/sdcli.exe format input=sentencia.tmp output=sent_formateada.tmp

또는 sh에서 인용하는 다른 방법.

cmd를 호출해야 하는 경우 with 대신 표준 입력이나 배치 파일로 cmd 코드를 전달해야 할 수도 있습니다 /c. 왜냐하면 따옴표를 다른 방식으로 구문 분석하기 때문입니다 /c(나에게는 이해가 되지 않습니다). 그럴 것이다

cmd <<<'"C:\Program Files\sqldeveloper\sqldeveloper\bin\sdcli.exe" format input=sentencia.tmp output=sent_formateada.tmp'

답변2

다른 답변에서 알 수 있듯이 Cygwin bash 프롬프트에서 직접 명령을 실행할 수 있어야 합니다. 그러나 파일/디렉터리 인수를 전달하는 경우 기본 Windows 프로그램은 기본 Windows 경로를 예상합니다. 이러한 경로를 직접 구성하는 대신 다음 cygpath도구를 사용할 수 있습니다.

# Emits, for example,  'C:\Program Files\MyApp\MyApp.exe'
cygpath --windows '/cygdrive/c/Program Files/MyApp/MyApp.exe'

알아야 할 또 다른 잠재적인 함정은 HOME 또는 TEMP와 같은 특정 공통 환경 변수에 대해 Windows와 Cygwin 간에 서로 다른 값을 가질 수 있다는 것입니다. 이는 일반적인 문제는 아니지만 의심되는 경우 명령보다 먼저 Windows 정의를 전달하십시오. 그러면 재정의된 값이 포함된 환경에서 프로그램이 시작됩니다. 예를 들어, TEMP는 /tmpCygwin에 있지만 Windows에서는 상당히 다르기 때문에 이로 인해 문제가 발생한 경우 다음과 같은 상황이 발생할 수 있습니다.

TEMP="$LOCALAPPDATA\\Temp" MyApp.exe foo bar ...

마지막으로, 공백이 포함된 인수는 반드시 인용하십시오.

참고로 Cygwin 스타일 인수를 입력할 수 있는 특정 Windows 프로그램에 별칭이 지정된 래퍼 스크립트가 있습니다. 래퍼를 사용하고 이 함수와 같은 것을 사용하여 인수를 기본 앱에 전달하기 전에 Windows 지원 형식으로 변환합니다.

# Process positional params, converting file path to Windows format
# and adding quotes around other params if they contain spaces. Result
# saved in array named WINFILEARGS. Call Windows app with single
# arg "${WINFILEARGS[@]}"
make_win_file_args() {
    declare -ga WINFILEARGS

    local SPACEREGEX="[[:alnum:]]+[[:space:]]+[[:alnum:]]+"
    local index=0
    for posparam ; do
        currparam="$posparam"
        if [[ -e $currparam ]]; then
            # Convert unix paths from command line to windows paths
            currparam="\"$(cygpath -w "${posparam}")\""
        elif [[ $currparam =~ $SPACEREGEX ]]; then
            # Quote non-file parameters that contain spaces
            currparam="\"${currparam}\""
        fi
        WINFILEARGS[$index]="$currparam"
        (( index=$index+1 ))
    done
}

관련 정보