storescu(1)

🌸 NAME 🌸

storescu β€” DICOM storage (C-STORE) SCU. Bestie, this is the storescu(1) page from the OFFIS DCMTK manual, and it's literally the β€œsend DICOM files to a peer” main character πŸ’–.


✨ SYNOPSIS ✨

storescu [options] peer port dcmfile-in...

πŸ’– DESCRIPTION πŸ’–

The storescu application implements a Service Class User (SCU) for the Storage Service Class. For each DICOM file on the command line it sends a C-STORE message to a Storage Service Class Provider (SCP) and waits for a response. The application can be used to transmit DICOM images and other DICOM composite objects. Slay πŸ’….


πŸŽ€ PARAMETERS πŸŽ€

  • peer β€” hostname of the DICOM peer 🌐
  • port β€” tcp/ip port number of the peer πŸ”Œ
  • dcmfile-in β€” DICOM file or directory to be transmitted πŸ“

πŸ’… OPTIONS πŸ’…

🌟 general options 🌟

  • -h, --help β€” print this help text and exit 🫢
  • --version β€” print version information and exit ⭐
  • --arguments β€” print expanded command line arguments 🧚
  • -q, --quiet β€” quiet mode, print no warnings and errors 🀫
  • -v, --verbose β€” verbose mode, print processing details πŸ”
  • -d, --debug β€” debug mode, print debug information πŸ› οΈ
  • -ll, --log-level β€” [l]evel: string constant (fatal, error, warn, info, debug, trace): use level l for the logger πŸ“
  • -lc, --log-config β€” [f]ilename: string: use config file f for the logger πŸ—‚οΈ
  • +v, --verbose-pc β€” show presentation contexts in verbose mode πŸ‘€

πŸ’– input options πŸ’–

input file format:

  • +f, --read-file β€” read file format or data set (default) πŸ“–
  • +fo, --read-file-only β€” read file format only 🎯
  • -f, --read-dataset β€” read data set without file meta information 🧾

input files:

  • +sd, --scan-directories β€” scan directories for input files (dcmfile-in) πŸ“‚
  • +sp, --scan-pattern β€” [p]attern: string (only with --scan-directories): pattern for filename matching (wildcards) πŸ”Ž
Page note: # possibly not available on all systems β€” so don't come for me if your system says nope πŸ™ˆ
  • -r, --no-recurse β€” do not recurse within directories (default) 🚫
  • +r, --recurse β€” recurse within specified directories πŸŒ€
  • -rn, --no-rename β€” do not rename processed files (default) 🏷️
  • +rn, --rename β€” append .done/.bad to processed files βœ…βŒ

🌐 network options 🌐

IP protocol version:

  • -i4, --ipv4 β€” use IPv4 only (default) 4️⃣
  • -i6, --ipv6 β€” use IPv6 only 6️⃣
  • -i0, --ip-auto β€” use DNS lookup to determine IP protocol 🌍

application entity titles:

  • -aet, --aetitle β€” [a]etitle: string: set my calling AE title (default: STORESCU) πŸ‘‘
  • -aec, --call β€” [a]etitle: string: set called AE title of peer (default: ANY-SCP) πŸ“ž

association negotiation profile from configuration file:

  • -xf, --config-file β€” [f]ilename, [p]rofile: string: use profile p from config file f πŸ—ƒοΈ

proposed transmission transfer syntaxes (not with --config-file):

  • -x=, --propose-uncompr β€” propose all uncompressed TS, explicit VR with local byte ordering first (default) πŸ’«
  • -xe, --propose-little β€” propose all uncompressed TS, explicit VR little endian first 🐣
  • -xb, --propose-big β€” propose all uncompressed TS, explicit VR big endian first 🐘
  • -xi, --propose-implicit β€” propose implicit VR little endian TS only 🧸
  • -xs, --propose-lossless β€” propose default JPEG lossless TS and all uncompressed transfer syntaxes 🌼
  • -xy, --propose-jpeg8 β€” propose default JPEG lossy TS for 8 bit data and all uncompressed transfer syntaxes 🎱
  • -xx, --propose-jpeg12 β€” propose default JPEG lossy TS for 12 bit data and all uncompressed transfer syntaxes πŸ•›
  • -xv, --propose-j2k-lossless β€” propose JPEG 2000 lossless TS and all uncompressed transfer syntaxes πŸ–ΌοΈ
  • -xw, --propose-j2k-lossy β€” propose JPEG 2000 lossy TS and all uncompressed transfer syntaxes 🎨
  • -xt, --propose-jls-lossless β€” propose JPEG-LS lossless TS and all uncompressed transfer syntaxes 🌸
  • -xu, --propose-jls-lossy β€” propose JPEG-LS lossy TS and all uncompressed transfer syntaxes πŸ“
  • -xm, --propose-mpeg2 β€” propose MPEG2 Main Profile @ Main Level TS only 🎬
  • -xh, --propose-mpeg2-high β€” propose MPEG2 Main Profile @ High Level TS only πŸŽ₯
  • -xn, --propose-mpeg4 β€” propose MPEG4 AVC/H.264 High Profile / Level 4.1 TS only πŸ“Ή
  • -xl, --propose-mpeg4-bd β€” propose MPEG4 AVC/H.264 BD-compatible HP / Level 4.1 TS only πŸ’Ώ
  • -x2, --propose-mpeg4-2-2d β€” propose MPEG4 AVC/H.264 HP / Level 4.2 TS for 2D Videos only 🎞️
  • -x3, --propose-mpeg4-2-3d β€” propose MPEG4 AVC/H.264 HP / Level 4.2 TS for 3D Videos only πŸ₯½
  • -xo, --propose-mpeg4-2-st β€” propose MPEG4 AVC/H.264 Stereo HP / Level 4.2 TS only 🎧
  • -x4, --propose-hevc β€” propose HEVC/H.265 Main Profile / Level 5.1 TS only πŸ”₯
  • -x5, --propose-hevc10 β€” propose HEVC/H.265 Main Profile / Level 5.1 TS only πŸ”₯
  • -xr, --propose-rle β€” propose RLE lossless TS and all uncompressed transfer syntaxes 🧩
  • -xd, --propose-deflated β€” propose deflated explicit VR little endian TS and all uncompressed transfer syntaxes 🫧
  • -R, --required β€” propose only required presentation contexts (default: propose all supported) 🚨
Page note: # This will also work with storage SOP classes that are supported by DCMTK but are not in the list of SOP classes proposed by default. β€” yes bestie, that's the tea β˜•
  • +C, --combine β€” combine proposed transfer syntaxes (default: separate presentation context for each TS) 🧬

post-1993 value representations:

  • +u, --enable-new-vr β€” enable support for new VRs (UN/UT) (default) ✨
  • -u, --disable-new-vr β€” disable support for new VRs, convert to OB 🧱

deflate compression level (only with --propose-deflated or --config-file):

  • +cl, --compression-level β€” [l]evel: integer (default: 6): 0=uncompressed, 1=fastest, 9=best compression πŸ—œοΈ

user identity negotiation:

  • -usr, --user β€” [u]ser name: string: authenticate using user name u πŸ™‹
  • -pwd, --password β€” [p]assword: string (only with --user): authenticate using password p πŸ”
  • -epw, --empty-password β€” send empty password (only with --user) πŸ«₯
  • -kt, --kerberos β€” [f]ilename: string: read kerberos ticket from file f 🎫
  • --saml β€” [f]ilename: string: read SAML request from file f πŸ“„
  • --jwt β€” [f]ilename: string: read JWT data from file f πŸͺͺ
  • -rsp, --pos-response β€” expect positive response πŸ‘

other network options:

  • -to, --timeout β€” [s]econds: integer (default: unlimited): timeout for connection requests ⏳
  • -ts, --socket-timeout β€” [s]econds: integer (default: 60): timeout for network socket (0 for none) 🧦
  • -ta, --acse-timeout β€” [s]econds: integer (default: 30): timeout for ACSE messages πŸ“¨
  • -td, --dimse-timeout β€” [s]econds: integer (default: unlimited): timeout for DIMSE messages πŸ’Œ
  • -pdu, --max-pdu β€” [n]umber of bytes: integer (4096..131072): set max receive pdu to n bytes (default: 16384) πŸ“¦
  • --max-send-pdu β€” [n]umber of bytes: integer (4096..131072): restrict max send pdu to n bytes πŸ“€
  • --repeat β€” [n]umber: integer: repeat n times πŸ”
  • --abort β€” abort association instead of releasing it πŸ’€
  • -nh, --no-halt β€” do not halt if unsuccessful store encountered (default: do halt) πŸ›‘
  • -up, --uid-padding β€” silently correct space-padded UIDs 🀫
  • +II, --invent-instance β€” invent a new SOP instance UID for every image sent πŸͺ„
  • +IR, --invent-series β€” [n]umber: integer (implies --invent-instance): invent a new series UID after n images have been sent (default: 100) πŸŽ€
  • +IS, --invent-study β€” [n]umber: integer (implies --invent-instance): invent a new study UID after n series have been sent (default: 50) πŸ“š
  • +IP, --invent-patient β€” [n]umber: integer (implies --invent-instance): invent a new patient ID and name after n studies have been sent (default: 25) πŸ§‘β€βš•οΈ

πŸŽ€ transport layer security (TLS) options πŸŽ€

transport protocol stack:

  • -tls, --disable-tls β€” use normal TCP/IP connection (default) πŸ”Œ
  • +tls, --enable-tls β€” [p]rivate key file, [c]ertificate file: string: use authenticated secure TLS connection πŸ”’
  • +tla, --anonymous-tls β€” use secure TLS connection without certificate πŸ•΅οΈ

private key password (only with --enable-tls):

  • +ps, --std-passwd β€” prompt user to type password on stdin (default) ⌨️
  • +pw, --use-passwd β€” [p]assword: string: use specified password πŸ”‘
  • -pw, --null-passwd β€” use empty string as password πŸ«™

key and certificate file format:

  • -pem, --pem-keys β€” read keys and certificates as PEM file (default) πŸ“œ
  • -der, --der-keys β€” read keys and certificates as DER file 🧾

certification authority:

  • +cf, --add-cert-file β€” [f]ilename: string: add certificate file to list of certificates βž•
  • +cd, --add-cert-dir β€” [d]irectory: string: add certificates in d to list of certificates πŸ“
  • +crl, --add-crl-file β€” [f]ilename: string: add certificate revocation list file (implies --enable-crl-vfy) 🚫
  • +crv, --enable-crl-vfy β€” enable leaf CRL verification πŸƒ
  • +cra, --enable-crl-all β€” enable full chain CRL verification ⛓️

security profile:

  • +ph, --list-profiles β€” list supported TLS profiles and exit πŸ“‹
  • +pg, --profile-8996 β€” BCP 195 RFC 8996 TLS Profile (default) 🌟
  • +pm, --profile-8996-mod β€” Modified BCP 195 RFC 8996 TLS Profile πŸ› οΈ
Page note: # only available if underlying TLS library supports all TLS features required for this profile β€” read the room, bestie πŸ™ˆ
  • +py, --profile-bcp195-nd β€” Non-downgrading BCP 195 TLS Profile (retired) πŸ‘΅
  • +px, --profile-bcp195 β€” BCP 195 TLS Profile (retired) πŸ‘΅
  • +pz, --profile-bcp195-ex β€” Extended BCP 195 TLS Profile (retired) πŸ‘΅
  • +pb, --profile-basic β€” Basic TLS Secure Transport Connection Profile (retired) πŸ‘΅
Page note: # only available if underlying TLS library supports 3DES β€” vintage behavior, handle with care πŸ’€
  • +pa, --profile-aes β€” AES TLS Secure Transport Connection Profile (retired) πŸ‘΅
  • +pn, --profile-null β€” Authenticated unencrypted communication (retired, was used in IHE ATNA) πŸ‘΅

πŸ’… ciphersuite:

  • +cc, --list-ciphers β€” prints out all the TLS ciphersuites we support and then bounces (exits). cute little info-dump, no connection made πŸ’…
  • +cs, --cipher [c]iphersuite name: string β€” adds a ciphersuite to the list of suites up for negotiation. yes bestie you can stack these πŸŽ€

πŸ¦‹ server name indication πŸ¦‹

  • --no-sni β€” do not use SNI. this is the default, no cap πŸ™ˆ
  • --request-sni [s]erver name: string β€” requests server name s. go ahead, name-drop the server ✨

πŸŽ€ pseudo random generator πŸŽ€

  • +rs, --seed [f]ilename: string β€” seeds the random generator with the contents of file f 🌱
  • +ws, --write-seed β€” writes the modified seed back out (only valid together with --seed) πŸ’Ύ
  • +wf, --write-seed-file [f]ilename: string β€” writes the modified seed to file f (also only with --seed) πŸ“

πŸ‘‘ peer authentication πŸ‘‘

  • -rc, --require-peer-cert β€” verifies the peer certificate and fails if it's absent. this is the default, she does not play 😀
  • -ic, --ignore-peer-cert β€” doesn't verify the peer certificate at all. living dangerously, love that for you πŸ’€

🌈 NOTES 🌈

πŸ” Scanning Directories πŸ”

okay so real talk: adding directories as a parameter on the command line only makes sense if you also pass --scan-directories. like, that's the whole deal 🫢

And if the files inside those directories should be picked based on a specific name pattern (e.g. using wildcard matching), you gotta use --scan-pattern. important detail bestie: that file pattern only applies to files within the scanned directories. and if any other patterns are specified on the command line outside the --scan-pattern option (say, to select further files), those patterns do not apply to the directories you specified. iykyk ✨

🧚 DICOM Conformance 🧚

storescu supports the following Storage SOP Classes as an SCU (look at this list, she ate):

ComputedRadiographyImageStorage                      1.2.840.10008.5.1.4.1.1.1
DigitalXRayImageStorageForPresentation               1.2.840.10008.5.1.4.1.1.1.1
DigitalXRayImageStorageForProcessing                 1.2.840.10008.5.1.4.1.1.1.1.1
DigitalMammographyXRayImageStorageForPresentation    1.2.840.10008.5.1.4.1.1.1.2
DigitalMammographyXRayImageStorageForProcessing      1.2.840.10008.5.1.4.1.1.1.2.1
DigitalIntraOralXRayImageStorageForPresentation      1.2.840.10008.5.1.4.1.1.1.3
DigitalIntraOralXRayImageStorageForProcessing        1.2.840.10008.5.1.4.1.1.1.3.1
CTImageStorage                                       1.2.840.10008.5.1.4.1.1.2
EnhancedCTImageStorage                               1.2.840.10008.5.1.4.1.1.2.1
UltrasoundMultiframeImageStorage                     1.2.840.10008.5.1.4.1.1.3.1
MRImageStorage                                       1.2.840.10008.5.1.4.1.1.4
EnhancedMRImageStorage                               1.2.840.10008.5.1.4.1.1.4.1
MRSpectroscopyStorage                                1.2.840.10008.5.1.4.1.1.4.2
UltrasoundImageStorage                               1.2.840.10008.5.1.4.1.1.6.1
SecondaryCaptureImageStorage                         1.2.840.10008.5.1.4.1.1.7
MultiframeSingleBitSecondaryCaptureImageStorage      1.2.840.10008.5.1.4.1.1.7.1
MultiframeGrayscaleByteSecondaryCaptureImageStorage  1.2.840.10008.5.1.4.1.1.7.2
MultiframeGrayscaleWordSecondaryCaptureImageStorage  1.2.840.10008.5.1.4.1.1.7.3
MultiframeTrueColorSecondaryCaptureImageStorage      1.2.840.10008.5.1.4.1.1.7.4
TwelveLeadECGWaveformStorage                         1.2.840.10008.5.1.4.1.1.9.1.1
GeneralECGWaveformStorage                            1.2.840.10008.5.1.4.1.1.9.1.2
AmbulatoryECGWaveformStorage                         1.2.840.10008.5.1.4.1.1.9.1.3
HemodynamicWaveformStorage                           1.2.840.10008.5.1.4.1.1.9.2.1
CardiacElectrophysiologyWaveformStorage              1.2.840.10008.5.1.4.1.1.9.3.1
BasicVoiceAudioWaveformStorage                       1.2.840.10008.5.1.4.1.1.9.4.1
GrayscaleSoftcopyPresentationStateStorage            1.2.840.10008.5.1.4.1.1.11.1
ColorSoftcopyPresentationStateStorage                1.2.840.10008.5.1.4.1.1.11.2
PseudoColorSoftcopyPresentationStateStorage          1.2.840.10008.5.1.4.1.1.11.3
BlendingSoftcopyPresentationStateStorage             1.2.840.10008.5.1.4.1.1.11.4
XRayAngiographicImageStorage                         1.2.840.10008.5.1.4.1.1.12.1
EnhancedXAImageStorage                               1.2.840.10008.5.1.4.1.1.12.1.1
XRayRadiofluoroscopicImageStorage                    1.2.840.10008.5.1.4.1.1.12.2
EnhancedXRFImageStorage                              1.2.840.10008.5.1.4.1.1.12.2.1
NuclearMedicineImageStorage                          1.2.840.10008.5.1.4.1.1.20
RawDataStorage                                       1.2.840.10008.5.1.4.1.1.66
SpatialRegistrationStorage                           1.2.840.10008.5.1.4.1.1.66.1
SpatialFiducialsStorage                              1.2.840.10008.5.1.4.1.1.66.2
RealWorldValueMappingStorage                         1.2.840.10008.5.1.4.1.1.67
VLEndoscopicImageStorage                             1.2.840.10008.5.1.4.1.1.77.1.1
VLMicroscopicImageStorage                            1.2.840.10008.5.1.4.1.1.77.1.2
VLSlideCoordinatesMicroscopicImageStorage            1.2.840.10008.5.1.4.1.1.77.1.3
VLPhotographicImageStorage                           1.2.840.10008.5.1.4.1.1.77.1.4
OphthalmicPhotography8BitImageStorage                1.2.840.10008.5.1.4.1.1.77.1.5.1
OphthalmicPhotography16BitImageStorage               1.2.840.10008.5.1.4.1.1.77.1.5.2
StereometricRelationshipStorage                      1.2.840.10008.5.1.4.1.1.77.1.5.3
OphthalmicTomographyImageStorage                     1.2.840.10008.5.1.4.1.1.77.1.5.4
BasicTextSRStorage                                   1.2.840.10008.5.1.4.1.1.88.11
EnhancedSRStorage                                    1.2.840.10008.5.1.4.1.1.88.22
ComprehensiveSRStorage                               1.2.840.10008.5.1.4.1.1.88.33
ProcedureLogStorage                                  1.2.840.10008.5.1.4.1.1.88.40
MammographyCADSRStorage                              1.2.840.10008.5.1.4.1.1.88.50
KeyObjectSelectionDocumentStorage                    1.2.840.10008.5.1.4.1.1.88.59
ChestCADSRStorage                                    1.2.840.10008.5.1.4.1.1.88.65
XRayRadiationDoseSRStorage                           1.2.840.10008.5.1.4.1.1.88.67
ColonCADSRStorage                                    1.2.840.10008.5.1.4.1.1.88.69
EncapsulatedPDFStorage                               1.2.840.10008.5.1.4.1.1.104.1
PositronEmissionTomographyImageStorage               1.2.840.10008.5.1.4.1.1.128
RTImageStorage                                       1.2.840.10008.5.1.4.1.1.481.1
RTDoseStorage                                        1.2.840.10008.5.1.4.1.1.481.2
RTStructureSetStorage                                1.2.840.10008.5.1.4.1.1.481.3
RTBeamsTreatmentRecordStorage                        1.2.840.10008.5.1.4.1.1.481.4
RTPlanStorage                                        1.2.840.10008.5.1.4.1.1.481.5
RTBrachyTreatmentRecordStorage                       1.2.840.10008.5.1.4.1.1.481.6
RTTreatmentSummaryRecordStorage                      1.2.840.10008.5.1.4.1.1.481.7

✨ okay now the fun part, the default behavior: storescu proposes two presentation contexts for each supported SOP class (abstract syntax) β€” one with the preferred transfer syntax, and one with all other uncompressed transfer syntaxes. periodt πŸ’…

The default preferred transfer syntax is explicit VR with byte ordering corresponding to the local byte ordering of the machine storescu is running on. this behavior can be changed with the --propose, --combine and --required options β€” see above 🌸

Depending on those options, the following transfer syntaxes are supported:

LittleEndianImplicitTransferSyntax                   1.2.840.10008.1.2
LittleEndianExplicitTransferSyntax                   1.2.840.10008.1.2.1
DeflatedExplicitVRLittleEndianTransferSyntax         1.2.840.10008.1.2.1.99 (*)
BigEndianExplicitTransferSyntax                      1.2.840.10008.1.2.2
JPEGProcess1TransferSyntax                           1.2.840.10008.1.2.4.50
JPEGProcess2_4TransferSyntax                         1.2.840.10008.1.2.4.51
JPEGProcess14SV1TransferSyntax                       1.2.840.10008.1.2.4.70
JPEGLSLosslessTransferSyntax                         1.2.840.10008.1.2.4.80
JPEGLSLossyTransferSyntax                            1.2.840.10008.1.2.4.81
JPEG2000LosslessOnlyTransferSyntax                   1.2.840.10008.1.2.4.90
JPEG2000TransferSyntax                               1.2.840.10008.1.2.4.91
MPEG2MainProfileAtMainLevelTransferSyntax            1.2.840.10008.1.2.4.100
MPEG2MainProfileAtHighLevelTransferSyntax            1.2.840.10008.1.2.4.101
MPEG4HighProfileLevel4_1TransferSyntax               1.2.840.10008.1.2.4.102
MPEG4BDcompatibleHighProfileLevel4_1TransferSyntax   1.2.840.10008.1.2.4.103
MPEG4HighProfileLevel4_2_For2DVideoTransferSyntax    1.2.840.10008.1.2.4.104
MPEG4HighProfileLevel4_2_For3DVideoTransferSyntax    1.2.840.10008.1.2.4.105
MPEG4StereoHighProfileLevel4_2TransferSyntax         1.2.840.10008.1.2.4.106
HEVCMainProfileLevel5_1TransferSyntax                1.2.840.10008.1.2.4.107
HEVCMain10ProfileLevel5_1TransferSyntax              1.2.840.10008.1.2.4.108
RLELosslessTransferSyntax                            1.2.840.10008.1.2.5
(*) only available if compiled with zlib support enabled (peep the --version output to check) 🫢

Additional Storage SOP Classes and transfer syntaxes can be used with the so-called "association negotiation profiles" (see below) πŸ‘‡

One more thing bestie: storescu does not support extended negotiation by default. However, using an appropriate association negotiation profile (again, see below) the optional support for extended negotiation can be added to particular SOP classes. slay πŸŽ€

🌸 Association Negotiation Profiles and Configuration Files 🌸

storescu supports a flexible mechanism for specifying the DICOM network association negotiation behavior, based on so-called "association negotiation profiles" which may be read from a configuration file. The format and semantics of this configuration file are documented in asconfig.txt. go read it, it's giving lore πŸ“–

πŸ’œ User Identity Negotiation πŸ’œ

When specifying user name and/or password using options --user and -e --password, the value has to be provided in UTF-8 encoding. no exceptions, bestie πŸ”₯

If the option --pos-response is used, the SCP is asked to explicitly respond β€” i.e. acknowledge β€” the user credentials provided in the storescu request. Otherwise, if no such response is sent, storescu will not continue, and instead aborts the connection 😭

Since User Identity Negotiation is an optional feature that was introduced later into the standard, many SCPs will not check the user identity provided and therefore will not provide a user identity response at all. so like... don't be shocked when it ghosts you πŸ™ˆ

πŸ’« LOGGING πŸ’«

Okay bestie, so the level of logging output from the various command line tools and the underlying libraries? Yeah, you can set that yourself. By default, only errors and warnings get written to the standard error stream β€” very demure, very mindful. πŸ™ˆ

Hit --verbose and you also get informational messages, like processing details. Slay. Want even more? --debug gives you way more details on the internal activity β€” like, ideal for debugging purposes. And if you want other logging levels, that's what --log-level is for. πŸ‘‘

In --quiet mode, only fatal errors get reported. And ngl, when those very severe error events happen, the application will usually just... terminate. πŸ’€

Want the full tea on the different logging levels? See the documentation of module "oflog" β€” it's all there, iykyk.

Now, if you want your logging output written to a file (optionally with logfile rotation), or to syslog (Unix) or the event log (Windows), use the --log-config option. This configuration file also lets you direct only certain messages to a particular output stream, and filter certain messages based on the module or application where they were generated. So picky, so iconic. ✨ An example configuration file is provided in <etcdir>/logger.cfg.


🌈 COMMAND LINE 🌈

All command line tools use this notation for parameters, so memorise the vibe check:

  • Square brackets enclose optional values (0-1).
  • Three trailing dots mean multiple values are allowed (1-n).
  • A combination of both means 0 to n values.

Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually the order and position of command line options are arbitrary β€” like, they can appear anywhere, main character energy. 🫢

But heads up: if options are mutually exclusive, the rightmost appearance is the one that's used. This behavior conforms to the standard evaluation rules of common Unix shells. Periodt.

Also! You can specify one or more command files using an '@' sign as a prefix to the filename (e.g. @command.txt). Such a command argument gets replaced by the content of the corresponding text file β€” with multiple whitespaces treated as a single separator unless they appear between two quotation marks β€” prior to any further evaluation. πŸŽ€

⚠️ Please note that a command file cannot contain another command file. No nesting, bestie, it's not that deep.

This simple but effective approach lets you summarise common combinations of options/parameters and avoids longish and confusing command lines. An example is provided in file <datadir>/dumppat.txt. Literally so convenient. πŸ’…


πŸ¦‹ ENVIRONMENT πŸ¦‹

The storescu utility will attempt to load DICOM data dictionaries specified in the DCMDICTPATH environment variable. By default β€” like, if the DCMDICTPATH environment variable is not set β€” the file <datadir>/dicom.dic will be loaded, unless the dictionary is built into the application (default for Windows).

The default behavior should be preferred, and the DCMDICTPATH environment variable only used when alternative data dictionaries are required. The DCMDICTPATH environment variable has the same format as the Unix shell PATH variable, in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. πŸͺŸ

The data dictionary code will attempt to load each file specified in the DCMDICTPATH environment variable.

πŸ’€ It is an error if no data dictionary can be loaded. Like, actual error. Not a vibe.

πŸ“ FILES πŸ“

  • <docdir>/asconfig.txt β€” configuration file documentation πŸ“–
  • <etcdir>/storescu.cfg β€” example association negotiation profile ✨

πŸ‘‘ SEE ALSO πŸ‘‘

storescp(1) β€” go say hi to its sibling 🫢


Copyright (C) 1996-2026 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany.


And that's the whole page, bestie, you ate that πŸ’…βœ¨ This was storescu(1), Version 3.7.1, dated Sat Oct 17 2026 09:34:01 β€” go forth and negotiate those associations, icon πŸ‘‘πŸŽ€πŸ’–

πŸ“¦ where this page comes from