diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 87a9c95430e953819393d1774974ef5eb345ff7c..303b0cf7560784cef55c23f147d51f34eda09b73 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -2760,8 +2760,11 @@ main(int argc, char *argv[])
 	}
 
 
-	/* Non-option argument specifies data directory */
-	if (optind < argc)
+	/* 
+	 * Non-option argument specifies data directory
+	 * as long as it wasn't already specified with -D / --pgdata
+	 */
+	if (optind < argc && strlen(pg_data) == 0)
 	{
 		pg_data = xstrdup(argv[optind]);
 		optind++;
diff --git a/src/bin/scripts/clusterdb.c b/src/bin/scripts/clusterdb.c
index b01f91c1d6e36e371d79cff862fb1cc96a124bb4..0f711e870b313a565fc4b6a1c387e705ec878db8 100644
--- a/src/bin/scripts/clusterdb.c
+++ b/src/bin/scripts/clusterdb.c
@@ -112,18 +112,22 @@ main(int argc, char *argv[])
 		}
 	}
 
-	switch (argc - optind)
+	/* 
+	 * Non-option argument specifies database name
+	 * as long as it wasn't already specified with -d / --dbname
+	 */
+	if (optind < argc && dbname == NULL)
 	{
-		case 0:
-			break;
-		case 1:
-			dbname = argv[optind];
-			break;
-		default:
-			fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"),
-					progname, argv[optind + 1]);
-			fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
-			exit(1);
+		dbname = argv[optind];
+		optind++;
+	}
+
+	if (optind < argc)
+	{
+		fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"),
+				progname, argv[optind + 1]);
+		fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
+		exit(1);
 	}
 
 	setup_cancel_handler();
diff --git a/src/bin/scripts/createlang.c b/src/bin/scripts/createlang.c
index c8b927c6758fbae810153c797b0f5b61810bcf6b..cc671a49767dd7f0eb7610f5c37209e8141da9da 100644
--- a/src/bin/scripts/createlang.c
+++ b/src/bin/scripts/createlang.c
@@ -91,14 +91,24 @@ main(int argc, char *argv[])
 		}
 	}
 
+	/*
+	 * We set dbname from positional arguments if it is not
+	 * already set by option arguments -d. If not doing
+	 * listlangs, positional dbname must follow positional
+	 * langname.
+	 */
+
 	if (argc - optind > 0)
 	{
 		if (listlangs)
-			dbname = argv[optind++];
+		{
+			if (dbname == NULL)
+				dbname = argv[optind++];
+		}
 		else
 		{
 			langname = argv[optind++];
-			if (argc - optind > 0)
+			if (argc - optind > 0 && dbname == NULL)
 				dbname = argv[optind++];
 		}
 	}
diff --git a/src/bin/scripts/droplang.c b/src/bin/scripts/droplang.c
index 66bc9664a5f6f5651c86669d456d8623b72ee027..47ec37f5e95464bc4519dd900266f08046b04338 100644
--- a/src/bin/scripts/droplang.c
+++ b/src/bin/scripts/droplang.c
@@ -90,14 +90,24 @@ main(int argc, char *argv[])
 		}
 	}
 
+	/*
+	 * We set dbname from positional arguments if it is not
+	 * already set by option arguments -d. If not doing
+	 * listlangs, positional dbname must follow positional
+	 * langname.
+	 */
+
 	if (argc - optind > 0)
 	{
 		if (listlangs)
-			dbname = argv[optind++];
+		{
+			if (dbname == NULL)
+				dbname = argv[optind++];
+		}
 		else
 		{
 			langname = argv[optind++];
-			if (argc - optind > 0)
+			if (argc - optind > 0 && dbname == NULL)
 				dbname = argv[optind++];
 		}
 	}
diff --git a/src/bin/scripts/reindexdb.c b/src/bin/scripts/reindexdb.c
index 54b478db60c98255923441ddcca3a31449f0655f..614a6885a0b944b4949d11b8bdd3dd0178dc9410 100644
--- a/src/bin/scripts/reindexdb.c
+++ b/src/bin/scripts/reindexdb.c
@@ -122,17 +122,22 @@ main(int argc, char *argv[])
 		}
 	}
 
-	switch (argc - optind)
+	/* 
+	 * Non-option argument specifies database name
+	 * as long as it wasn't already specified with -d / --dbname
+	 */
+	if (optind < argc && dbname == NULL)
 	{
-		case 0:
-			break;
-		case 1:
-			dbname = argv[optind];
-			break;
-		default:
-			fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"), progname, argv[optind + 1]);
-			fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
-			exit(1);
+		dbname = argv[optind];
+		optind++;
+	}
+
+	if (optind < argc)
+	{
+		fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"),
+				progname, argv[optind + 1]);
+		fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
+		exit(1);
 	}
 
 	setup_cancel_handler();
diff --git a/src/bin/scripts/vacuumdb.c b/src/bin/scripts/vacuumdb.c
index 1698c5f630b36864b943f37d7f650f0dadf76e0e..fe303ad8853aa9b3535681ee43eca23d1e96d8c9 100644
--- a/src/bin/scripts/vacuumdb.c
+++ b/src/bin/scripts/vacuumdb.c
@@ -135,18 +135,23 @@ main(int argc, char *argv[])
 		}
 	}
 
-	switch (argc - optind)
+	
+	/* 
+	 * Non-option argument specifies database name
+	 * as long as it wasn't already specified with -d / --dbname
+	 */
+	if (optind < argc && dbname == NULL)
 	{
-		case 0:
-			break;
-		case 1:
-			dbname = argv[optind];
-			break;
-		default:
-			fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"),
-					progname, argv[optind + 1]);
-			fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
-			exit(1);
+		dbname = argv[optind];
+		optind++;
+	}
+
+	if (optind < argc)
+	{
+		fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"),
+				progname, argv[optind + 1]);
+		fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
+		exit(1);
 	}
 
 	if (analyze_only)